3

来自 ISO 标准草案:§ 3.0/9

n3234 说:

根据每个翻译单元中指定的名称的链接(3.5),在多个翻译单元中使用的名称可能会引用这些翻译单元中的同一实体。

任何人都可以用一个例子来解释这一点吗?

那句话实际上在说什么?任何人都可以用程序来证明这一点吗?

4

2 回答 2

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;
}

现在globalIntC.cpp 中引用的变量与 D.cpp 中变量不同,即使它们具有相同的名称。

希望这可以帮助!

于 2011-03-25T05:57:54.200 回答
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" 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".)

于 2011-03-25T06:00:18.103 回答