2016-12-23 20 views
2

在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; 
} 
+5

如果你希望你的全局变量有内部链接(即只内,只在定义文件中可见) - 它们标记为'static',或者把它们放在匿名'namespace'。 –

+0

你应该在file2.cc中有“extern i” – Aram

+0

全局变量是** global ** - 它随处可用。 –

回答

6

相同的全局变量的多个定义是不允许的。您必须标记变量staticconst,或将它们放置在匿名名称空间中。否则他们在全球范围内。

而且你的第二个问题:示例代码无法编译,因为编译器不看到来自其他文件中的全局变量,因为编译器在编译时一个转换单元(C++文件)。这就是为什么你需要添加extern i;。这告诉编译器,该变量将在另一个翻译单元中定义。

后的所有文件已成功编译,它们将被链接。链接器检查所有翻译单元。当您得到关于多个定义的错误时,在链接期间发生此错误。

+1

未命名的名称空间规则仅在C++ 11中有效,对吗? http://stackoverflow.com/questions/13396748/are-objects-in-anonymous-namespace-implicitly-static – gurka

+0

谢谢!您的回答完全消除了我的困惑:) – Felix

1

全球范围内为同一可执行链接文件是一样的。为了避免这种情况,你可以声明它为static,但在C++中不赞成。
分离两个文件范围的正确方法是使用namespaces

1

您的变量在相同的范围内。您必须使用名称空间来声明具有相同名称的变量。

+0

新增示例帮助更好地阐明了答案 – GurV