将以下内容视为C文件:
static struct S a;
int main() {
return (long)&a;
}
struct S {
int b;
} s;
根据我对C11 spec的阅读,我认为这是未定义的行为。 6.9.2州:
具有没有初始化程序的文件范围且没有存储类说明符或存储类说明符为静态的对象的标识符声明构成暂定定义。
并在Semantics标题下(不是Constraints):
如果对象的标识符声明是暂定定义并且具有内部链接,则声明的类型不应是不完整的类型。
第一行的声明似乎是一个暂定的定义,并且对象a
具有内部链接,但struct S
在声明时具有不完整的类型。所以,我希望这会违反第二次引用,从而导致未定义的行为。
但是,GCC在使用--std=c11 -Wall -pedantic
标志运行时不会打印任何诊断。我是否误解了标准,或者GCC没有为这种类型的未定义行为打印诊断信息?
答案 0 :(得分:4)
是的,这是未定义的。
未定义的行为正如该术语所指示的那样,它不是由标准定义的。任何编译器都可以添加自己的定义,从而扩展标准,并且没有义务诊断它们中的任何一个。特别是,gcc对暂定定义有一些特殊的想法。使用这些代码的代码不可移植。