gpt4 book ai didi

c - 这是什么类型的声明?

转载 作者:太空狗 更新时间:2023-10-29 16:32:33 26 4
gpt4 key购买 nike

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

最佳答案

看起来像 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 错误,clang 以及 comeau online正在编译代码。

$6.9.2/2

A declaration of an identifier for an object that has file scope without an initializer, and without a storage-class specifier or with the storage-class specifier static, constitutes a tentative definition. If a translation unit contains one or more tentative definitions for an identifier, and the translation unit contains no external definition for that identifier, then the behavior is exactly as if the translation unit contains a file scope declaration of that identifier, with the composite type as of the end of the translation unit, with an initializer equal to 0.


关于c - 这是什么类型的声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13627974/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com