【问题标题】:What type of declaration is this?这是什么类型的声明?
【发布时间】:2012-11-17 15:44:35
【问题描述】:

从此question扩展

我无法理解这段代码。

struct foo myfoo;  // --> Is it forward declaration or object creation. ?

struct foo
{
 int a;
};

int main()
{

return 0;
}

代码中标注箭头-->是前向声明还是对象创建。 ?

如果那是前向声明,那么 struct foo; 叫什么?如果是对象创建或实例化,那么如何在结构定义之前创建对象。

gcc 编译器工作正常,但其他编译器出错。

gcc -Werror -Wall tst.c -o tst

gcc的这种行为有什么建议或解释吗?我无法在任何地方找到它的记录。

【问题讨论】:

  • 我没有机会查看 C99 标准,所以我仍然不确定它是否在某处指定,+1。
  • @melpomene,或者可能是一个功能?似乎理解该结构稍后在同一文件中定义。
  • @mux:我在标准中查看了它,但找不到然后发布了这个问题。我将不得不再看一次

标签: c gcc struct


【解决方案1】:
 struct foo myfoo; 

这是一个类型为foo 的C 变量定义,称为myfoo。 C 要求您在 struct 变量声明前显式声明 struct

现在,您的代码不应编译,因为编译器不知道您定义 myfoo 的位置,foo 的类型。编译器应该抱怨 foo 是一个不完整的类型。

编辑:

废话,这将被称为暂定定义

【讨论】:

  • 暂定定义在第 6.9.2/2 节中以“翻译单元末尾的复合类型”结束,我相信这就是我们在问题中的内容。
  • 什么是“兼容模式”?暂定定义在 C 标准中描述。
【解决方案2】:

看起来像 myfoo 的暂定定义,并且因为提供了结构的定义,所以您不会出错。

clang 在未定义类型时提供全面的诊断。

prasoon@ats-VPCEB3AGG:~$ cat tst.c
struct foo myfoo;

//struct foo{
//  int x ;
//} ;

int main()
{
}
prasoon@ats-VPCEB3AGG:~$ clang tst.c
tst.c:1:12: error: tentative definition has type 'struct foo' that is never
      completed
struct foo myfoo;

我认为它不是 gcc 错误,clang 以及 comeau online 正在编译代码。

$6.9.2/2

具有文件范围但没有初始化器的对象的标识符声明,以及 没有存储类说明符或带有存储类说明符 static,构成一个 暂定定义。如果一个翻译单元包含一个或多个暂定定义 标识符,并且翻译单元不包含该标识符的外部定义,则 该行为就像翻译单元包含该文件的文件范围声明一样 标识符,具有从翻译单元末尾开始的复合类型,带有初始化器 等于 0。


【讨论】:

  • 好收获,C99 6.9.2/2。这是一个棘手的问题(当您通常习惯于 C++ 时)。
  • 有趣的是标准在他们的例子中没有提到结构(在 C11 中也没有)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-02
  • 2020-05-12
  • 1970-01-01
  • 1970-01-01
  • 2011-04-16
相关资源
最近更新 更多