Подтвердить что ты не робот

Значение по умолчанию для члена struct в C

Можно ли установить значения по умолчанию для некоторого члена структуры? Я попробовал следующее, но это вызовет синтаксическую ошибку:

typedef struct
{
  int flag = 3;
} MyStruct;

Ошибки:

$ gcc -o testIt test.c 
test.c:7: error: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘=’ token
test.c: In function ‘main’:
test.c:17: error: ‘struct <anonymous>’ has no member named ‘flag’
4b9b3361

Ответ 1

Структура - это тип данных. Вы не даете значения типу данных. Вы даете значения экземплярам/объектам типов данных.
Так что это невозможно в C.

Вместо этого вы можете написать функцию, которая выполняет инициализацию для экземпляра структуры.

В качестве альтернативы вы можете сделать:

struct MyStruct_s 
{
    int id;
} MyStruct_default = {3};

typedef struct MyStruct_s MyStruct;

И затем всегда инициализируйте свои новые экземпляры следующим образом:

MyStruct mInstance = MyStruct_default;

Ответ 2

Я согласен с Als, что вы не можете инициализировать во время определения структуры в C. Но вы можете инициализировать структуру во время создания экземпляра, показанного ниже.

В C,

 struct s {
        int i;
        int j;
    };

    struct s s_instance = { 10 ,20 };

в С++ его можно дать прямое значение в определении структуры, показанной ниже

struct s {
    int i;

    s(): i(10)
    {
    }
};

Ответ 3

Создайте структуру по умолчанию, как уже упоминалось в других ответах:

struct MyStruct
{
    int flag;
}

MyStruct_default = {3};

Однако приведенный выше код не будет работать в заголовочном файле - вы получите ошибку: multiple definition of 'MyStruct_default'. Чтобы решить эту проблему, используйте вместо этого extern в заголовочном файле:

struct MyStruct
{
    int flag;
};

extern const struct MyStruct MyStruct_default;

И в файле c:

const struct MyStruct MyStruct_default = {3};

Надеюсь, это поможет любому, кто испытывает проблемы с заголовочным файлом.

Ответ 4

Вы можете использовать некоторую функцию для инициализации структуры следующим образом:

typedef struct
{
    int flag;
} MyStruct;

MyStruct GetMyStruct(int value)
{
    MyStruct My = {0};
    My.flag = value;
    return My;
}

void main (void)
{
    MyStruct temp;
    temp = GetMyStruct(3);
    printf("%d\n", temp.flag);
}

EDIT:

typedef struct
{
    int flag;
} MyStruct;

MyStruct MyData[20];

MyStruct GetMyStruct(int value)
{
    MyStruct My = {0};
    My.flag = value;
    return My;
}

void main (void)
{
    int i;
    for (i = 0; i < 20; i ++)
        MyData[i] = GetMyStruct(3);

    for (i = 0; i < 20; i ++)
        printf("%d\n", MyData[i].flag);
}

Ответ 5

Функция инициализации структуры - это хороший способ присвоить ей значения по умолчанию:

Mystruct s;
Mystruct_init(&s);

Или даже короче:

Mystruct s = Mystruct_init();  // this time init returns a struct

Ответ 6

Другой подход к значениям по умолчанию. Создайте функцию инициализации того же типа, что и структура. Этот подход очень полезен при разбиении большого кода на отдельные файлы.

struct structType{
  int flag;
};

struct structType InitializeMyStruct(){
    struct structType structInitialized;
    structInitialized.flag = 3;
    return(structInitialized); 
};


int main(){
    struct structType MyStruct = InitializeMyStruct();
};

Ответ 7

Другой подход, если это позволяет структура, заключается в использовании #define со значениями по умолчанию внутри:

#define MYSTRUCT_INIT { 0, 0, true }

typedef struct
{
    int id;
    int flag;
    bool foo;
} MyStruct;

Использование:

MyStruct val = MYSTRUCT_INIT;