Значение по умолчанию для члена 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’
Ответы
Ответ 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;