我们可以在结构定义之前在文件范围内声明结构对象吗?

时间:2019-04-21 06:49:43

标签: c

根据下面给出的代码及其答案:

  

问题:以下哪个结构声明会引发错误?

     
      
  1. struct temp { char c; } s;
    int main(void) {}
    
  2.   
  3. struct temp { char c; };
    struct temp s;
    int main(void) {}
    
  4.   
  5. struct temp s; 
    struct temp { char c; };
    int main(void) {}
    
  6.   
  7. 以上都不是。

  8.   
     

答案:4

这是正确的吗?我们可以先声明结构对象然后再声明结构定义吗?

1 个答案:

答案 0 :(得分:14)

是的,有时候C很奇怪。因为该变量在文件作用域内并且没有初始化程序或存储类说明符,所以它构成了一个暂定的定义。 C标准对其定义如下:

  

6.9.2外部对象定义

     

声明具有文件范围的对象的标识符   没有初始化程序,没有存储类说明符,或者没有   存储类说明符是静态的,构成一个暂定   定义。如果翻译单元包含一个或多个暂定词   标识符的定义,翻译单元不包含   标识符的外部定义,则行为完全相同   好像翻译单元包含该文件的文件范围声明   标识符,复合类型截至翻译结束   单位,且初始值设定为0。

我强调了相关部分。因为您的变量上没有初始化程序,所以就好像您在文件的最后写了它,并将其初始化为零。文件的物理布局并不重要,因为从逻辑上讲,结构类型的定义位于文件的末尾。

所以答案确实是(4)。我不会在现实生活中写这样的代码,但是,这在C生态系统中非常混乱,在C生态系统中,必须预先声明几乎所有东西都必须使用。