不同的文件有不同的范围吗?

时间:2016-12-23 13:40:58

标签: c++

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

3 个答案:

答案 0 :(得分:6)

不允许对同一个全局变量进行多次定义。您必须标记变量staticconst,或将它们放在匿名命名空间中。否则,它们属于全球范围。

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

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

答案 1 :(得分:1)

在同一个可执行文件中链接的文件的全局范围是相同的。为了避免这种情况,您可以将其声明为static,但在c ++中已弃用 分隔两个文件范围的正确方法是使用namespaces

答案 2 :(得分:1)

您的变量属于同一范围。您必须使用名称空间才能声明具有相同名称的变量。