16

从这个问题延伸

我很难理解这段代码。

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?我无法在任何地方找到它的记录。

4

2 回答 2

16

看起来像暂定定义,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。


于 2012-11-29T14:36:15.487 回答
-2
 struct foo myfoo; 

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

现在,你的代码不应该编译,因为编译器不知道你定义你的地方myfoo,什么样的类型foo。编译器应该抱怨foo是一个不完整的类型。

编辑:

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

于 2012-11-29T14:31:37.730 回答