来自ISO标准草案:§3.0/9
:
n3234说:
多个翻译单元中使用的名称可能会引用该名称 这些翻译单元中的同一实体取决于该链接(3.5) 每个翻译单位指定的名称。
有人可以用一个例子解释这一点吗?
该声明究竟在说什么?任何人都能用程序来证明这一点吗?
答案 0 :(得分:7)
当然!这说的是,如果你有多个源文件(翻译单元)都使用某个名称(例如,变量,类或函数的名称),那么这些不同的文件可能正在讨论相同的变量,类或函数,假设该实体的声明方式使其在不同文件中可见(即,取决于其链接)。
例如,如果我有这个文件:
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;
}
现在,C.cpp中引用的globalInt
变量不与D.cpp中的变量相同,即使它们具有相同的名称。
希望这有帮助!
答案 1 :(得分:0)
啊,标准......让我们模糊不清。
它说,如果你在两个不同的源文件中使用同名的全局变量,如果它们是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”是static
/ extern
/默认全局,或auto
几乎从未提及,因为它意味着“在堆栈上分配”,这是默认的在函数内部声明的变量,对于函数外部的声明显然没有意义。“转换单元”是标准避免提及“文件”的常用方法。)