这是什么类型的声明?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (97)

从这个问题延伸

我无法理解此代码。

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?我无法找到任何记录。

提问于
用户回答回答于

看起来像是暂定的定义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;
用户回答回答于
 struct foo myfoo; 

这是foo调用类型的C变量定义myfoo。C要求你明确声明变量声明的struct前面

现在,你的代码不应该编译,因为编译器不知道在你定义的地方myfoofoo看起来是什么类型。编译器应该报错foo是不完整的类型。

扫码关注云+社区

领取腾讯云代金券