这是什么类型的声明?

时间:2012-11-29 14:30:04

标签: c gcc struct

从此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此行为的任何建议或解释?我无法在任何地方找到它。

2 个答案:

答案 0 :(得分: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 bug,clang以及comeau online正在编译代码。

$ 6.9.2 / 2

  

具有没有初始化程序的文件范围的对象的标识符声明,以及      没有存储类说明符或存储类说明符静态,构成一个         暂定的定义。如果翻译单元包含一个或多个临时定义            然后,标识符和转换单元不包含该标识符的外部定义                 行为就像翻译单元包含该文件范围声明一样                  标识符,具有复制类型,如翻译单元的末尾,带有初始化程序                   等于0。

     

答案 1 :(得分:-2)

 struct foo myfoo; 

这是名为foo的{​​{1}}类型的C变量定义。 C要求您在myfoo变量声明前面明确说明struct

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

编辑:

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