来自 ISO 标准草案:§ 3.0/9
:
n3234 说:
根据每个翻译单元中指定的名称的链接(3.5),在多个翻译单元中使用的名称可能会引用这些翻译单元中的同一实体。
任何人都可以用一个例子来解释这一点吗?
那句话实际上在说什么?任何人都可以用程序来证明这一点吗?
当然!这就是说,如果您有多个源文件(翻译单元)都使用某个名称(例如,变量、类或函数的名称),那么这些不同的文件可能在谈论同一个变量,类或函数,假设该实体以使其在不同文件中可见的方式声明(即,取决于其链接)。
例如,如果我有这个文件:
A.cpp:
int globalInt;
int main() {
globalInt = 137;
}
而这个在这里:
B.cpp:
extern int globalInt;
void foo() {
globalInt = 42;
}
然后在这两个文件中,名称globalInt
指的是A.cpp 中定义的全局int
变量。globalInt
这就是这一点的全部内容。
但是请注意,如果我globalInt
在没有外部链接的情况下声明,那么这两个文件将讨论不同的变量。例如,在这种情况下:
C.cpp:
static int globalInt;
int main() {
globalInt = 137;
}
D.cpp:
static int globalInt;
void foo() {
globalInt = 42;
}
现在globalInt
C.cpp 中引用的变量与 D.cpp 中的变量不同,即使它们具有相同的名称。
希望这可以帮助!
啊,标准......让我们混淆显而易见的。
就是说,如果您在两个不同的源文件中使用同名的全局变量,则无论是否extern
指定,它们都是同一个变量,但如果声明了其中任何一个,static
那么它们将是完全独立的因为它们仅在该源文件中可见。
int a; // can be seen in other files; this may be duplicated in multiple source files
static int b; // can only be used in this file
extern int c; // explicitly using a visible variable "c" defined in another file
("Linkage" is the static
/extern
/default global, or auto
which is almost never mentioned since it means "allocated on the stack", which is the default for variables declared inside a function and obviously not meaningful for a declaration outside a function. "Translation unit" is a common way for standards to avoid mentioning "files".)