【发布时间】:2011-10-23 14:26:09
【问题描述】:
为什么这是合法的?
extern int foo = 0xF00; // Gets a warning, still compiles
extern void bar() { // No warning
int x;
}
是否有理由允许这样做?
【问题讨论】:
为什么这是合法的?
extern int foo = 0xF00; // Gets a warning, still compiles
extern void bar() { // No warning
int x;
}
是否有理由允许这样做?
【问题讨论】:
有时候很有用
extern const int foo = 0xF00;
如果没有 extern,在 C++ 中 foo 将是 static 并具有内部链接(这意味着您不能使用来自另一个翻译单元的 foo)。
在您的示例中,这两种情况下的 extern 都是多余的。 In C99 an extern can make a difference for inline functions..
【讨论】:
foo 即使没有 extern,也会有外部链接。
在函数的情况下,我觉得就像写:
extern void bar();
void bar()
{
int x;
}
这必须是合法的,因为具有定义的文件可能包含带有此类声明的标头。
【讨论】:
IIUC,在 C 标准中,定义被视为带有初始化器的声明,因此适用于声明的所有内容同样适用于定义。
(实际上,定义将是为变量分配存储空间的声明,因此 C 的暂定定义(没有初始化器)将符合条件,而那些充当定义但没有初始化器的 C++ 声明也将符合条件。指出定义本质上是一个声明加上一些附加的行为仍然适用)。
【讨论】: