何时对象声明不是定义?

时间:2017-08-17 12:48:31

标签: c

当对象声明不是定义时,所有情况都是什么?

根据Cuts in a Nutshell中的以下引用,我想出了一个试探性的答案。当且仅当

时,对象声明是非定义声明是否正确?
  1. 当对象声明在功能块内时,它没有初始化器,并且具有存储类说明符extern

  2. 当对象声明在所有函数之外时,它没有inititilizer和

    • 要么具有存储类说明符" extern",
    • 或没有extern说明符,其出现的翻译单元具有相同标识符的另一个声明,该标识符是标识符的定义
  3. 等效地,当且仅当

    时,对象声明才是非定义声明
    1. 对象声明没有初始值设定项;

    2. 对象声明也满足以下任一条件:

      • 对象声明具有存储类说明符extern

      • 或对象声明没有存储类说明符extern,并且在所有函数之外,并且它出现的转换单元具有相同标识符的另一个声明,该标识符是标识符的定义

    3. C in a Nutshell说:

        

      如果对象声明为其分配存储,则它是一个定义   宾语。包含初始值设定项的声明始终是定义。   此外,功能块内的所有声明都是   定义,除非它们包含存储类说明符   extern

           

      如果在所有函数之外声明一个对象,则不使用   初始值设定项,没有存储类说明符extern,   声明是一个暂定的定义。暂定的   如果翻译单位,标识符仍然是一个简单的声明   包含相同标识符的另一个定义。如果没有,那么   编译器的行为就好像暂定定义包含了一个   初始值设定值为零,使其成为定义。

      感谢。

0 个答案:

没有答案