Предложение
pratik сработает (при условии, что его использование typedef
является опечаткой), но оно оставляет глобальный объект, плавающий вокруг. Альтернативная техника:
struct d {
unsigned int size;
};
/* use only *one* of these next lines */
#define D (struct d){20} // C99
#define D {20} // C89
…
struct d foo = D; // in either case
Преимущество версии C99 в том, что она может улавливать некоторые злоупотребления «конструктором», например, ,
struct d {
unsigned int size;
};
#define D99 (struct d){.size = 20}
#define D89 {20}
…
float a[17] = D89; // compiles, but is that really what you meant?
float b[17] = D99; // will not compile
Кроме того, вы можете использовать технику «составного литерала» для создания более сложных конструкторов, возможно, с аргументами.