根据C标准:
在构成整个程序的翻译单元和库的集合中,具有外部链接的特定标识符的每个声明 表示相同的对象或功能.在一个翻译单元内,具有内部链接的标识符的每个声明 表示相同的对象或功能.没有链接的标识符的每个声明 表示唯一的实体.
在我的例子中,我们有三个单独的声明,每个标识符具有不同的链接.所以为什么这不起作用?
static int a; //a_Internal
int main(void) {
int a; //a_Local
{
extern int a; //a_External
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
错误:
在函数'main'中:第9行:错误:变量先前声明'static'relayclared'extern'
为什么编译器坚持要重新声明我而不是尝试访问另一个文件中的外部对象?
有效的C++示例供参考:
static void f();
static int i = 0; // #1
void g() {
extern void f(); // internal linkage
int i; // #2 i has no linkage
{
extern void f(); // internal linkage
extern int i; // #3 external linkage
}
}
Run Code Online (Sandbox Code Playgroud)
Clang和VC似乎都适用于我的C示例; 只有某些版本的GCC(并非所有版本)都会产生上述错误.