从此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
的这种行为有什么建议或解释吗?我在任何地方都找不到记录在案的它。
发布于 2012-11-29 22:36:15
看起来像是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。
发布于 2012-11-29 22:31:38
struct foo myfoo;
这是一个名为myfoo
的foo
类型的C变量定义。C要求您在struct
变量声明前显式声明struct
。
现在,你的代码不应该被编译,因为编译器不知道你定义myfoo
的地方是什么类型的foo
。编译器应该会报告foo
是一个不完整的类型。
编辑:
放弃这一点,这将被称为暂定定义。
https://stackoverflow.com/questions/13627974
复制相似问题