关于不完整类型的结构的初步定义

Shi*_*dia 5 c language-lawyer c11

将以下内容视为C文件:

static struct S a;

int main() {
  return (long)&a;
}

struct S {
  int b;
} s;
Run Code Online (Sandbox Code Playgroud)

根据我对C11规范的阅读,我认为这是未定义的行为。6.9.2状态:

具有文件范围而没有初始化程序,没有存储类说明符或具有存储类说明符静态的对象的标识符的声明构成了临时定义。

并在语义标题下(不是约束):

如果对象标识符的声明是一个临时定义,并且具有内部链接,则声明的类型不应是不完整的类型。

似乎第一行的声明是一个临时定义,并且该对象a具有内部链接,但struct S在声明时其类型不完整。因此,我希望这会违反第二个引号,从而导致未定义的行为。

但是,使用这些--std=c11 -Wall -pedantic标志运行时,GCC不会打印任何诊断信息。我是不是误解了标准,还是GCC没有为这种类型的不确定行为打印诊断?

Jen*_*edt 5

是的,这是未定义的。

未定义的行为正是该术语所表示的意思,它不是由标准定义的。任何编译器都可以添加自己的定义,从而扩展标准,并且没有义务诊断其中任何一个。特别是,gcc对于暂定定义有一些特殊的想法。使用这些的代码不可移植。