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