C99 语言中具有未命名成员的结构的正确行为是什么?
Which is the correct behavior of the struct with unnamed member in C99 language?
#include <stdio.h>
struct s {int;};
int main()
{
printf("Size of 'struct s': %i\n", sizeof(struct s));
return 0;
}
Microsoft C 编译器 (cl.exe) 不想编译此代码。
error C2208: 'int' : no members defined using this type
GNU C 编译器 (gcc -std=c99) 编译此代码...
warning: declaration does not declare anything
...并显示结果:
Size of 'struct s': 0
这意味着gcc中的struct s
是完整类型,不能重新定义。
这是否意味着完整类型的大小可以为零?
此外,如果此声明声明了完整的结构,消息 declaration does not declare anything
是什么意思?
这里证明 struct s
是 (gcc -std=c99) 中的完整类型。
#include <stdio.h>
struct s {int;};
struct S {
struct s s; // <=========== No problem to use it
};
int main()
{
printf("Size of 'struct s': %i\n", sizeof(struct s));
return 0;
}
根据 C 标准未定义此行为。
J.2 未定义的行为:
The behavior is undefined in the following circumstances:
....
— A structure or union is defined without any named members (including those specified indirectly via anonymous structures and unions) (6.7.2.1).
struct s {int;};
等同于 struct s {};
(无成员)并且 GCC 允许将其作为 extension.
struct empty {
};
The structure has size zero.
这使得上述程序成为特定于编译器的程序。
大小为 0 的类型不是标准类型。那是一个 gcc 扩展。
如果您将 -pedantic-errors 添加到您的 gcc 编译行,则它不会编译。
#include <stdio.h>
struct s {int;};
int main()
{
printf("Size of 'struct s': %i\n", sizeof(struct s));
return 0;
}
Microsoft C 编译器 (cl.exe) 不想编译此代码。
error C2208: 'int' : no members defined using this type
GNU C 编译器 (gcc -std=c99) 编译此代码...
warning: declaration does not declare anything
...并显示结果:
Size of 'struct s': 0
这意味着gcc中的struct s
是完整类型,不能重新定义。
这是否意味着完整类型的大小可以为零?
此外,如果此声明声明了完整的结构,消息 declaration does not declare anything
是什么意思?
这里证明 struct s
是 (gcc -std=c99) 中的完整类型。
#include <stdio.h>
struct s {int;};
struct S {
struct s s; // <=========== No problem to use it
};
int main()
{
printf("Size of 'struct s': %i\n", sizeof(struct s));
return 0;
}
根据 C 标准未定义此行为。
J.2 未定义的行为:
The behavior is undefined in the following circumstances:
....
— A structure or union is defined without any named members (including those specified indirectly via anonymous structures and unions) (6.7.2.1).
struct s {int;};
等同于 struct s {};
(无成员)并且 GCC 允许将其作为 extension.
struct empty { };
The structure has size zero.
这使得上述程序成为特定于编译器的程序。
大小为 0 的类型不是标准类型。那是一个 gcc 扩展。
如果您将 -pedantic-errors 添加到您的 gcc 编译行,则它不会编译。