Можно ли установить значения по умолчанию для некоторого члена структуры? Я пробовал следующее, но это вызвало синтаксическую ошибку:
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’
Ответы:
Структура - это тип данных . Вы не присваиваете значения типу данных. Вы присваиваете значения экземплярам / объектам типов данных.
Так что нет, это невозможно в C.
Вместо этого вы можете написать функцию, которая выполняет инициализацию экземпляра структуры.
В качестве альтернативы вы можете сделать:
struct MyStruct_s { int id; } MyStruct_default = {3}; typedef struct MyStruct_s MyStruct;
И затем всегда инициализируйте свои новые экземпляры как:
источник
ты не можешь сделать это таким образом
Вместо этого используйте следующее
typedef struct { int id; char* name; }employee; employee emp = { .id = 0, .name = "none" };
Вы можете использовать макрос для определения и инициализации ваших экземпляров. это упростит вам задачу каждый раз, когда вы захотите определить новый экземпляр и инициализировать его.
typedef struct { int id; char* name; }employee; #define INIT_EMPLOYEE(X) employee X = {.id = 0, .name ="none"}
и в вашем коде, когда вам нужно определить новый экземпляр с типом сотрудника, вы просто вызываете этот макрос, например:
источник
Я согласен с Алсом в том, что вы не можете инициализировать во время определения структуры в C. Но вы можете инициализировать структуру во время создания экземпляра, как показано ниже.
В C,
struct s { int i; int j; }; struct s s_instance = { 10 ,20 };
в C ++ можно указать прямое значение в определении структуры, показанной ниже
struct s { int i; s(): i(10) { } };
источник
Ты можешь сделать:
struct employee_s { int id; char* name; } employee_default = {0, "none"}; typedef struct employee_s employee;
И тогда вам просто нужно не забыть выполнить инициализацию по умолчанию, когда вы объявляете новую переменную сотрудника:
В качестве альтернативы вы всегда можете просто создать структуру своего сотрудника с помощью фабричной функции.
источник
Если вы используете,
gcc
вы можете предоставитьdesignated initializers
создание объекта.typedef struct { int id=0; char* name="none"; }employee; employee e = { .id = 0; .name = "none"; };
Или просто используйте как инициализацию массива.
employee e = {0 , "none"};
источник
Создайте структуру по умолчанию, как упоминалось в других ответах:
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};
Надеюсь, это поможет любому, у кого возникнут проблемы с файлом заголовка.
источник
Более того, чтобы добавить существующие ответы, вы можете использовать макрос, который скрывает инициализатор структуры:
#define DEFAULT_EMPLOYEE { 0, "none" }
Затем в вашем коде:
источник
Вы можете реализовать функцию инициализации:
employee init_employee() { empolyee const e = {0,"none"}; return e; }
источник
Вы можете использовать некоторую функцию для инициализации структуры следующим образом:
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); }
РЕДАКТИРОВАТЬ:
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); }
источник
Вы можете использовать комбинацию функций препроцессора C с varargs , составными литералами и назначенными инициализаторами для максимального удобства:
typedef struct { int id; char* name; } employee; #define EMPLOYEE(...) ((employee) { .id = 0, .name = "none", ##__VA_ARGS__ }) employee john = EMPLOYEE(.name="John"); // no id initialization employee jane = EMPLOYEE(.id=5); // no name initialization
источник
Если вы используете эту структуру только один раз , то есть создаете глобальную / статическую переменную, вы можете удалить
typedef
и сразу же инициализировать эту переменную:struct { int id; char *name; } employee = { .id = 0, .name = "none" };
После этого вы можете использовать
employee
в своем коде.источник
Функция инициализации для структуры - хороший способ предоставить ей значения по умолчанию:
Или даже короче:
Mystruct s = Mystruct_init(); // this time init returns a struct
источник
Другой подход к значениям по умолчанию. Сделайте функцию инициализации того же типа, что и структура. Этот подход очень полезен при разделении большого кода на отдельные файлы.
struct structType{ int flag; }; struct structType InitializeMyStruct(){ struct structType structInitialized; structInitialized.flag = 3; return(structInitialized); }; int main(){ struct structType MyStruct = InitializeMyStruct(); };
источник
Вы можете создать для него функцию:
typedef struct { int id; char name; } employee; void set_iv(employee *em); int main(){ employee em0; set_iv(&em0); } void set_iv(employee *em){ (*em).id = 0; (*em).name = "none"; }
источник
Другой подход, если структура позволяет это, - использовать #define со значениями по умолчанию внутри:
#define MYSTRUCT_INIT { 0, 0, true } typedef struct { int id; int flag; bool foo; } MyStruct;
Использование:
источник
Я думаю, что это можно сделать следующим образом,
typedef struct { int flag : 3; } MyStruct;
источник