首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >这是什么类型的声明?

这是什么类型的声明?
EN

Stack Overflow用户
提问于 2012-11-29 22:30:04
回答 2查看 810关注 0票数 16

从此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的这种行为有什么建议或解释吗?我在任何地方都找不到记录在案的它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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。

票数 16
EN

Stack Overflow用户

发布于 2012-11-29 22:31:38

 struct foo myfoo; 

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

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

编辑:

放弃这一点,这将被称为暂定定义

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13627974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档