我有以下结构类型:初始化匿名结构的,解决方法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) –
编译器没有拒绝它 - 它只发出警告。你应该认真对待,但这可能不成问题。如何编写一个简短的测试程序来检查对象是否按照预期初始化? –