C中的声明或定义

23 c declaration definition

来自外部变量Wiki:

如果extern关键字和初始化值都不存在,则该语句可以是声明或定义.由编译器来分析程序的模块并做出决定.

我无法完全理解关于C的这个陈述的含义.例如,它是否意味着:

int i;
Run Code Online (Sandbox Code Playgroud)

不一定是声明(因为我一直假设到现在为止),但可能是一个定义,以及(通过定义和声明在同一网页的定义,没有双关语意)?

简而言之,就是上述陈述:a.只是声明,或b.声明+定义?

参考:变量声明和定义

收到的答复摘要:

                         Declaration    Definition    Tentative Definition   Initialized 
int i;   (inside a block)    Yes           Yes                No                No
int i=5; (inside a block)    Yes           Yes                No               Yes(to 5)
int i;   (otherwise)         Yes            No               Yes               Yes(to 0)
extern int i;                Yes            No                No                No


All definitions are declarations but not vice-versa.
Run Code Online (Sandbox Code Playgroud)

Mic*_*urr 15

假设它在文件范围内,那就是"暂定".从6.9.2/2"外部对象定义":

具有没有初始化程序的文件范围且没有存储类说明符或存储类说明符为静态的对象的标识符声明构成暂定定义.如果翻译单元包含一个或多个标识符的暂定定义,并且翻译单元不包含该标识符的外部定义,那么行为就像翻译单元包含该标识符的文件范围声明一样,复合类型为翻译单元的结尾,初始化程序等于0.

这意味着在翻译单元中也有以下内容:

int i = 42;
Run Code Online (Sandbox Code Playgroud)

因为该声明具有显式初始化器,所以它是变量的定义i.

如果声明在块范围内,则标准说明如下(6.2.2/2"标识符链接"):

没有链接的标识符的每个声明表示唯一的实体.

...

(第6段) 以下标识符没有链接:...没有存储类说明符extern声明的对象的块作用域标识符.

所以在块范围内,声明也是一个定义.


小智 14

C标准说

标识符的定义是该标识符的声明:对于对象,导致为该对象保留存储(...)

定义包含声明,即每个定义必然是一个声明,所以说这是没有意义的

int i;
Run Code Online (Sandbox Code Playgroud)

不是声明.这一个恰好是定义的声明.或者,它是一个定义,因此是一个声明.

  • 但是,请记住,并非所有声明都是定义,这是一个好主意. (7认同)