任何人都可以解释这部分C ++ 0x草案标准吗?

时间:2011-03-25 05:54:30

标签: c++ c++11 linkage

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

n3234说:

  

多个翻译单元中使用的名称可能会引用该名称         这些翻译单元中的同一实体取决于该链接(3.5)         每个翻译单位指定的名称。

有人可以用一个例子解释这一点吗?

该声明究竟在说什么?任何人都能用程序来证明这一点吗?

2 个答案:

答案 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几乎从未提及,因为它意味着“在堆栈上分配”,这是默认的在函数内部声明的变量,对于函数外部的声明显然没有意义。“转换单元”是标准避免提及“文件”的常用方法。)