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 编译行,则它不会编译。