2012-11-29 139 views
16

从此延伸question这是什么类型的声明?

我很难理解此代码。

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

struct foo 
{ 
int a; 
}; 

int main() 
{ 

return 0; 
} 

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

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

gcc编译它工作正常,但其他的编译器会发出错误。

gcc -Werror -Wall tst.c -o tst 

对此行为的任何建议或解释gcc?我无法找到任何记录。

+0

我没有得到一个机会,看看C99的标准,所以我仍然不知道,如果是在某处指定+1。 – iabdalkader

+0

@melpomene:我同意 – Omkant

+0

@melpomene,或者一个功能?看起来好像理解结构是在稍后的同一个文件中定义的。 – Shahbaz

回答

16

貌似的myfoo暂定定义,因为设置了结构的定义,你没有错误。

clang提供了一个全面的诊断,当类型在未定义。

[email protected]:~$ cat tst.c 
struct foo myfoo; 

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

int main() 
{ 
} 
[email protected]:~$ 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


+4

好抓,C99 6.9.2/2。这是一个棘手的问题(当你习惯了C++)。 – netcoder

+0

标准在他们的例子中没有提及struct(在C11中都没有),这很有趣。 – Shahbaz

-2
struct foo myfoo; 

即称为myfoofoo类型的C变量的定义。 C要求您在struct变量声明前明确声明struct

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

编辑:

废料的是,这将被称为暂定定义

+5

我不认为你完全阅读这个问题。 – Shahbaz

+0

在第6.9.2/2节中,暂定的定义最终“以复合类型作为翻译单元的末尾”,我相信这就是我们在问题中的含义。 – Mat

+0

什么“兼容模式”?暂定义在C标准中有描述。 – Mat