Структуры в C с начальными значениями

Я хочу создать структуру в C с начальными значениями, например:

typedef struct {
    int id = 0;
    char *name = "none";
} employee;

Я знаю, что это невозможно, есть ли другой способ сделать это?

Ответ 1

вы не можете сделать это таким образом

Используйте вместо этого

typedef struct
{
   int id;
   char* name;
}employee;

employee emp = {
.id = 0, 
.name = "none"
};

Вы можете использовать макросы define и инициализировать свои экземпляры. это облегчит вам каждый раз, когда вы хотите определить новый экземпляр и инициализировать его.

typedef struct
{
   int id;
   char* name;
}employee;

#define INIT_EMPLOYEE(X) employee X = {.id = 0, .name ="none"}

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

INIT_EMPLOYEE(emp);

Ответ 2

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

Ответ 3

Вы можете сделать:

struct employee_s {
  int id;
  char* name;
} employee_default = {0, "none"};

typedef struct employee_s employee;

И тогда вам просто нужно запомнить инициализацию по умолчанию, когда вы объявляете новую переменную сотрудника:

employee foo = employee_default;

Кроме того, вы всегда можете создать структуру своего сотрудника с помощью функции factory.

Ответ 4

Если вы используете gcc, вы можете дать designated initializers при создании объекта.

typedef struct
{
   int id=0;
   char* name="none";
}employee;

employee e = 
{
 .id = 0;
 .name = "none";
};

Или просто используйте как инициализацию массива.

employee e = {0 , "none"};

Ответ 5

Вы можете реализовать функцию инициализации:

employee init_employee() {
  empolyee const e = {0,"none"};
  return e;
}

Ответ 6

Тем более, чтобы добавить существующие ответы, вы можете использовать макрос, который скрывает инициализатор структуры:

#define DEFAULT_EMPLOYEE { 0, "none" }

Затем в вашем коде:

employee john = DEFAULT_EMPLOYEE;

Ответ 7

Вы можете использовать комбинацию функции препроцессора 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