C语言嵌套结构体编译行为差异的技术咨询
问题本质
你提到的GeeksforGeeks示例代码,用了不符合C标准的“伪嵌套结构体”写法——在struct Organisation内部仅定义struct Employee类型,却没有声明对应的成员变量,也不满足标准嵌套结构体的语法要求。
不同编译器行为的底层逻辑
部分在线编译器的
warning: declaration does not declare anything提示
这种写法只是在结构体内部声明了一个结构体类型,却没有定义任何成员变量,对严格遵循标准的编译器来说属于无意义代码,因此抛出警告。但多数编译器会做宽松兼容,跳过无效声明继续编译,所以程序仍能正常输出。GCC将内部
Employee解析为非嵌套结构体
GCC默认编译模式会对C标准做扩展,它会把结构体内部的struct Employee定义提升到全局作用域,当作全局类型处理,而非仅属于Organisation的嵌套类型。这就导致后续代码可以直接使用该类型,和在外部定义效果一致。gcc test.c -ansi -pedantic的警告原因-ansi指定遵循ISO C90标准,-pedantic要求严格执行标准、禁用编译器扩展。而C90标准完全不支持无名结构体/联合体——你在Organisation内部的struct Employee定义没有绑定到任何成员变量,属于无名结构体范畴,因此GCC会抛出ISO C90 doesn't support unnamed structs/unions的警告。不过GCC仍会兼容生成可执行文件,只是明确告知写法不符合标准。
标准嵌套结构体写法示例
如果要实现合规的嵌套结构体,有两种标准写法:
// 写法1:内部定义结构体类型并声明成员 struct Organisation { char org_name[50]; struct Employee { char emp_name[50]; int emp_id; } emp; // 声明成员变量emp }; // 写法2:先定义外部结构体类型,再在内部声明成员 struct Employee { char emp_name[50]; int emp_id; }; struct Organisation { char org_name[50]; struct Employee emp; };
内容的提问来源于stack exchange,提问作者taku1029

