int i; // A.
extern int i; // B.
我知道A是变量的定义。也就是说,编译器创建一个对象并为变量i
分配一块内存。但是什么是B?定义和声明之间有什么区别?
答案 0 :(得分:4)
这是宣言。它说有一个整数i
将在别处定义。
答案 1 :(得分:2)
extern关键字引入了变量声明,而不是定义。它说某个源文件中的某个地方会有一个用给定声明定义的变量,它允许源文件引用变量而不会麻烦,但实际上并没有定义变量。这允许在一个文件中定义的一个变量在多个源文件中共享和访问,而每个文件都没有自己的独立副本。
答案 2 :(得分:2)
案例A)是一种具有外部联系的“暂定定义”。您可以在一个翻译单元中拥有多个这些,并且所有这些都将引用相同的变量。该定义称为暂定,因为如果在翻译单元中没有使用显式初始值设定项的其他定义,它只会对变量进行零初始化。
案例B)是一个声明但不是定义(暂定的或其他的),因为没有初始化器存在且不会保留存储空间。在这个或另一个翻译单元的其他地方必须有一个有效的变量定义。如果在范围内存在具有内部链接的变量的先前声明,则变量将具有内部链接,否则为外部链接,即
static int foo;
extern int foo;
导致有效的暂定定义与内部联系,而
extern int foo;
static int foo;
无效,因为您有一个带有外部链接的声明,后跟一个带有内部链接的(暂定)定义。
有关详细信息,请参阅C99第6.2.2和6.9.2节。
答案 3 :(得分:1)
B声明变量i
在别处定义,通常在不同的翻译单元中。 Wikipedia article不会是继续研究的好地方。
答案 4 :(得分:0)
A)除了声明变量i之外,它实际上是i的隐式定义。
B)i的声明。您需要定义变量i some where。