C++ 有人能解释一下C++;标准草案?

C++ 有人能解释一下C++;标准草案?,c++,c++11,linkage,C++,C++11,Linkage,来自ISO标准草案:§3.0/9: n3234表示: 在多个翻译单元中使用的名称可能会引用 这些translationunits中的相同实体取决于 在每个翻译单元中指定的名称 有人能举例说明这一点吗 那份声明到底在说什么?有人能用程序来证明这一点吗?当然!这意味着,如果您有多个源文件(翻译单元),它们都使用某个名称(例如,变量、类或函数的名称),那么这些不同的文件可能涉及同一个变量、类或函数,假设该实体的声明方式使其在不同文件中可见(即,取决于其链接) 例如,如果我有此文件: A.cpp: in

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

n3234表示:

在多个翻译单元中使用的名称可能会引用 这些translationunits中的相同实体取决于 在每个翻译单元中指定的名称

有人能举例说明这一点吗


那份声明到底在说什么?有人能用程序来证明这一点吗?

当然!这意味着,如果您有多个源文件(翻译单元),它们都使用某个名称(例如,变量、类或函数的名称),那么这些不同的文件可能涉及同一个变量、类或函数,假设该实体的声明方式使其在不同文件中可见(即,取决于其链接)

例如,如果我有此文件:

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中的变量不同,尽管它们具有相同的名称


希望这有帮助

啊,标准。。。让我们把显而易见的事情弄糊涂

这意味着,如果在两个不同的源文件中使用具有相同名称的全局变量,如果它们是
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

(“链接”是
静态
/
外部
/默认全局,或
自动
,几乎从未提及,因为它意味着“在堆栈上分配”,这是函数内部声明的变量的默认值,对于函数外部声明显然没有意义。“转换单元”是标准中避免提及“文件”的常用方法。

请注意,如果只有一个文件声明它是静态的,那么它仍然是独立的,尽管第三个文件
E.cpp
仍然可以获取未声明的
静态的
@geekosaur:除此之外,如果有多个声明为既不是
静态
也不是
外部
,则链接器将输出一个关于已定义的对象的错误。因此,您始终只能定义一个
int globalInt
,所有其他的都必须是
extern
(然后它们指原始的)或
静态的
(然后它们与原始的映射,并且只在同一个翻译单元内有效)。@Mephane:不完全是;看@ GeKeSoaul:其他问题只被标记为C,这里的这个是C++。你肯定在C++中也有什么应用吗?