【发布时间】:2016-12-23 13:40:58
【问题描述】:
在 file1.cc 我写
int i = 0;
在 file2.cc 中我写
#include <iostream>
int i = 1;
int main()
{
std::cout<< i << std::endl;
return 0;
}
在 MacOS 中编译器报告
duplicate symbol _i in:
/var/folders/wn/q9648wb507j9l504vp2d_dwm0000gn/T/file1-bb8eca.o
/var/folders/wn/q9648wb507j9l504vp2d_dwm0000gn/T/file2-b5e667.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
但是不是说不同的文件有不同的作用域,这样我们就可以在file2中定义一个和file1同名的全局变量吗? 而且,如果不同的文件在同一个范围内,那么为什么将file2.cc转换为非法:
#include <iostream>
int main()
{
std::cout<< i <<std::endl;
return 0;
}
【问题讨论】:
-
如果您希望全局变量具有内部链接(即仅在定义它们的文件中可见)- 将它们标记为
static,或将它们放入匿名namespace。 -
你应该在 file2.cc 中有“extern i”
-
一个全局变量是global——它无处不在。
-
请注意,关于范围、可见性或生命周期的文件和语言规则是正交的。您真正要问的是不同翻译单元中的变量是否具有不同的范围。一个翻译单元通常由许多不同的文件组成——*.cc 或 *.cpp(或其他)文件和直接或间接使用
#include拉入的头文件。见stackoverflow.com/questions/1106149/…
标签: c++