从此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
此行为的任何建议或解释?我无法在任何地方找到它。
答案 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
是一个不完整的类型。
编辑:
报废,这将被称为暂定定义。