为什么extern可以应用于定义?

时间:2011-10-23 14:26:09

标签: c++ c extern

为什么这是合法的?

extern int foo = 0xF00; // Gets a warning, still compiles

extern void bar() { // No warning
  int x;
}

为什么允许这样做是否有理由?

3 个答案:

答案 0 :(得分:7)

有时它很有用

extern const int foo = 0xF00;

如果没有extern,则在C ++中foostatic并且具有内部链接(这意味着您无法使用其他翻译单元中的foo)。

在您的示例中,两种情况下的extern都是多余的。 In C99 an extern can make a difference for inline functions.

答案 1 :(得分:2)

在功能案例中,我认为这就像写作:

extern void bar();
void bar()
{
  int x;
}

必须合法,因为带有定义的文件可能包含带有此类声明的标题。

答案 2 :(得分:0)

IIUC,在C标准中,定义被视为具有初始化器的声明,因此适用于声明的所有内容同样适用于定义。

(实际上,定义将是一个为变量分配存储的声明,因此C的暂定定义(没有初始化器)将符合条件,并且那些在没有初始化器的情况下充当定义的C ++声明也符合条件。指出定义本质上是一个声明加上一些添加的行为仍然适用。)