当对象声明不是定义时,所有情况都是什么?
根据Cuts in a Nutshell中的以下引用,我想出了一个试探性的答案。当且仅当
时,对象声明是非定义声明是否正确?当对象声明在功能块内时,它没有初始化器,并且具有存储类说明符extern
当对象声明在所有函数之外时,它没有inititilizer和
extern
说明符,其出现的翻译单元具有相同标识符的另一个声明,该标识符是标识符的定义等效地,当且仅当
时,对象声明才是非定义声明对象声明没有初始值设定项;
对象声明也满足以下任一条件:
对象声明具有存储类说明符extern
,
或对象声明没有存储类说明符extern
,并且在所有函数之外,并且它出现的转换单元具有相同标识符的另一个声明,该标识符是标识符的定义
C in a Nutshell说:
如果对象声明为其分配存储,则它是一个定义 宾语。包含初始值设定项的声明始终是定义。 此外,功能块内的所有声明都是 定义,除非它们包含存储类说明符
extern
。如果在所有函数之外声明一个对象,则不使用 初始值设定项,没有存储类说明符
extern
, 声明是一个暂定的定义。暂定的 如果翻译单位,标识符仍然是一个简单的声明 包含相同标识符的另一个定义。如果没有,那么 编译器的行为就好像暂定定义包含了一个 初始值设定值为零,使其成为定义。
感谢。