Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 不完全类型结构的初步定义_C_Language Lawyer_C11 - Fatal编程技术网

C 不完全类型结构的初步定义

C 不完全类型结构的初步定义,c,language-lawyer,c11,C,Language Lawyer,C11,将以下内容视为C文件: static struct S a; int main() { return (long)&a; } struct S { int b; } s; 根据我对的阅读,我认为这是一种未定义的行为。6.9.2说明: 对于具有文件作用域但没有初始值设定项、没有存储类说明符或具有存储类说明符static的对象,其标识符的声明构成了一个暂定定义 在语义标题下(非约束): 如果对象标识符的声明是一个暂定定义,并且具有内部链接,则声明的类型不应是不完整的类型 第一行

将以下内容视为C文件:

static struct S a;

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

struct S {
  int b;
} s;
根据我对的阅读,我认为这是一种未定义的行为。6.9.2说明:

对于具有文件作用域但没有初始值设定项、没有存储类说明符或具有存储类说明符static的对象,其标识符的声明构成了一个暂定定义

在语义标题下(非约束):

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

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

但是,当使用
--std=c11-Wall-pedantic
标志运行时,GCC不会打印任何诊断。我是否误解了标准,或者GCC没有打印这种未定义行为的诊断?

是,这是未定义的


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

FWIW clang生成以下警告:“警告:带有内部链接的变量的暂定定义具有不完整的非数组类型‘struct S’[-Wtentative definition complete type]”GCC尝试生成合理的结果,而不是拒绝代码,尽管
-pedantic-std=c11
限制了它的接受范围。所示程序中
a
的地址不需要取决于
a
的类型(以及大小);这可能是你逃脱惩罚的部分原因。如果在结构类型完成后添加一个访问
a
的函数(并调用该函数),是否会发生任何变化?然而,这肯定不是一个答案——这只是偶然的观察long@chux而不是UB,而是实现定义的行为,则code>为UB。6.3.2.3/5.@SomeName:顺便说一句,我想不出一个真正的用例,用于对带有不完整类型的外部链接的标识符进行暂定定义。我期待它发生;可能的原因可能是自动生成的代码。但是我没有什么要说的。对于非静态对象,您是否可以发布一个解释它们的链接或一两个示例。它们听起来很糟糕,这就是为什么我可能从未使用过它们,因此不确定它们是什么。猜测一下,这可能是这样的:
staticintfoo;外间国际办事处
在文件范围内???抱歉,我忽略了您在暂定定义中的
静态