为什么这是合法的?
extern int foo = 0xF00; // Gets a warning, still compiles
extern void bar() { // No warning
int x;
}
为什么允许这样做是否有理由?
答案 0 :(得分:7)
有时它很有用
extern const int foo = 0xF00;
如果没有extern
,则在C ++中foo
将static
并且具有内部链接(这意味着您无法使用其他翻译单元中的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 ++声明也符合条件。指出定义本质上是一个声明加上一些添加的行为仍然适用。)