根据下面给出的代码及其答案:
问题:以下哪个结构声明会引发错误?
struct temp { char c; } s; int main(void) {}
struct temp { char c; }; struct temp s; int main(void) {}
struct temp s; struct temp { char c; }; int main(void) {}
以上都不是。
答案:4
这是正确的吗?我们可以先声明结构对象然后再声明结构定义吗?
答案 0 :(得分:14)
是的,有时候C很奇怪。因为该变量在文件作用域内并且没有初始化程序或存储类说明符,所以它构成了一个暂定的定义。 C标准对其定义如下:
6.9.2外部对象定义
声明具有文件范围的对象的标识符 没有初始化程序,没有存储类说明符,或者没有 存储类说明符是静态的,构成一个暂定 定义。如果翻译单元包含一个或多个暂定词 标识符的定义,翻译单元不包含 标识符的外部定义,则行为完全相同 好像翻译单元包含该文件的文件范围声明 标识符,复合类型截至翻译结束 单位,且初始值设定为0。
我强调了相关部分。因为您的变量上没有初始化程序,所以就好像您在文件的最后写了它,并将其初始化为零。文件的物理布局并不重要,因为从逻辑上讲,结构类型的定义位于文件的末尾。
所以答案确实是(4)。我不会在现实生活中写这样的代码,但是,这在C生态系统中非常混乱,在C生态系统中,必须预先声明几乎所有东西都必须使用。