C99语言中未命名成员的结构的正确行为是什么? #包括 结构s{int;}; int main() { printf(“结构s的大小:%i\n”,sizeof(结构s)); 返回0; }

C99语言中未命名成员的结构的正确行为是什么? #包括 结构s{int;}; int main() { printf(“结构s的大小:%i\n”,sizeof(结构s)); 返回0; },c,visual-c++,gcc,struct,c99,C,Visual C++,Gcc,Struct,C99,Microsoft C编译器(cl.exe)不希望编译此代码 error C2208: 'int' : no members defined using this type GNUC编译器(gcc-std=c99)编译此代码 warning: declaration does not declare anything …并显示结果: Size of 'struct s': 0 这意味着gcc中的结构是完整类型,不能重新定义。 这是否意味着完整类型的大小可以为零 另外,如果此声明声明了完整的

Microsoft C编译器(cl.exe)不希望编译此代码

error C2208: 'int' : no members defined using this type
GNUC编译器(gcc-std=c99)编译此代码

warning: declaration does not declare anything
…并显示结果:

Size of 'struct s': 0
这意味着gcc中的结构是完整类型,不能重新定义。
这是否意味着完整类型的大小可以为零

另外,如果此声明声明了完整的结构,那么消息
声明不声明任何内容是什么意思

这里证明了
结构是一个完整的in类型(gcc-std=c99)

#包括
结构s{int;};
结构{

根据C标准,该行为未定义

J.2未定义的行为: 在以下情况下,该行为未定义:
..
-定义的结构或联合没有任何命名成员(包括通过匿名结构和联合间接指定的成员)(6.7.2.1)

struct s{int;};
相当于
struct s{};
(无成员),GCC允许将其作为

该结构的大小为零


这使上述程序成为特定于编译器的程序。

大小为0的类型不是标准类型。这是gcc扩展


如果在gcc编译行中添加-pedantic错误,那么它将无法编译。

OK。对于结构行为或编译器行为,该行为未定义?没问题,但为什么MS C编译器不希望编译具有未定义行为的代码。在这种情况下,哪种行为更好?MSVC或gcc?@mezoni;结果将特定于编译器。谢谢!将此添加到完整性的答案中。我认为这是gcc的一个特性,但不是c99@VolAnd.谢谢。这是因为对我来说,语言规范中的术语
未定义行为
是不可理解的。运行时未定义行为或编译时未定义行为。“警告:声明不声明任何内容”是关于编译时的。未定义的行为是关于运行时的。@Voler,不。未定义的行为只是意味着标准没有强加任何要求。我同意,不可能为语言的错误用法编写要求。但对我个人来说,“未定义的行为”而是关于以“糟糕的编程示例”编写的程序,而不是关于使用“糟糕的编程示例”执行任何操作的编译器嗯,令人惊讶的是,即使使用-ansi-pedantic,gcc仍然可以为我编译。感谢
-pedantic
@mezoni,强制保证编译器错误的唯一方法是
-pedantic errors
。顺便说一句,
-ansi
只是指C89/90。
struct empty {

};