extern int i;// is a declaration
int j; //definition
作者给出的第一个陈述是一个声明,第二个是一个定义。我认为第二个陈述是一个声明,第一个是一个定义。
我浏览了 Herbert Schildt 的完整参考 C
关键字extern
是用来声明外部变量的,书上说的没错。
有一个例外,如果添加了初始化程序,那么它是一个定义:
extern int i = 42;
首先,第一个和第二个都不是“声明”。在 C 语言中,声明不是语句。声明就是声明,声明就是声明——在 C 语言中,这是两个独立的不相交的世界。
其次,每个定义同时也是一个声明。定义只是一种特殊的声明。所以反对声明和定义是不正确的,这是一种相互排斥的方式。
第三,评论说的是对的,你错了。第一个是非定义声明。第二个是定义。
第四,第二个是所谓的暂定定义——C特有的特性。它有一些特殊的性质。在一般情况下,它不一定定义具有外部链接的变量。它定义的变量的链接可能取决于上下文。在您的具体示例中,从字面上看,它确实定义了一个具有外部链接的变量。您可以搜索术语暂定定义以了解更多信息。
第五,希尔特的书已经成熟,存在大量术语错误(而不仅仅是术语错误)。这实际上是他们最出名的。
声明:刚刚声明的变量
Ex: int i;
定义:declaration+its initialization
带值的变量。
Ex: int i=10;
在你的情况下
extern int i;// is a declaration
//because you did not initialize value to i here.
假设 j 是全局变量。然后在声明时用零初始化。
这里declaration+initialization =definition
int j; //definition
如果 j 是本地的,那么它只是声明。