我有以下結構類型:初始化匿名結構的,解決方法GCC 4.9
typedef struct PG_Point PG_Point;
struct PG_Point
{
int x;
int y;
};
typedef struct PG_Size PG_Size;
struct PG_Size
{
int width;
int height;
};
typedef struct PG_Bounds PG_Bounds;
struct PG_Bounds
{
union
{
struct
{
PG_Point topLeft;
PG_Size size;
};
struct
{
struct
{
int x;
int y;
};
struct
{
int width;
int height;
};
};
};
};
有以下初始化:
#define PG_Point_init(ix, iy) {.x=(ix), .y=(iy)}
#define PG_Size_init(iwidth, iheight) {.width=(iwidth), .height=(iheight)}
#define PG_Bounds_init(ix, iy, iwidth, iheight) { \
.topLeft=PG_Point_init((ix),(iy)), \
.size=PG_Size_init((iwidth),(iheight)) }
據我瞭解,這是正確的c11初始化匿名結構的字段,就好像它們是包含結構的直接字段一樣?但是用gcc 4.9.2,這給出了以下警告:
警告:缺少初始值設定的領域 '大小' '結構<匿名>'[-Wmissing場-初始化]
它如果我將初始化程序更改爲此版本,則可行:
#define PG_Bounds_init(ix, iy, iwidth, iheight) {{{ \
.topLeft=PG_Point_init((ix),(iy)), \
.size=PG_Size_init((iwidth),(iheight)) }}}
也就是說,顯式地使用union和struct作爲子聚合。
這甚至允許嗎?我是否期望其他編譯器拒絕這個?
試着用'-pedantic'編譯。如果它不給你警告,你應該很好去。 –
是的,我已經做到了,鏗鏘聲3.5.0和gcc 6.3.0沒有什麼可抱怨的。仍然不確定在閱讀[本答案]的標準報價後是否允許它(https://stackoverflow.com/a/5065829/2371524) –
編譯器沒有拒絕它 - 它只發出警告。你應該認真對待,但這可能不成問題。如何編寫一個簡短的測試程序來檢查對象是否按照預期初始化? –