C中的int和extern int有什么区别?

时间:2011-01-12 09:28:40

标签: c

int i;        // A.
extern int i; // B.

我知道A是变量的定义。也就是说,编译器创建一个对象并为变量i分配一块内存。但是什么是B?定义和声明之间有什么区别?

5 个答案:

答案 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