c++ - 不同的文件有不同的范围吗?

标签 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;
}

最佳答案

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

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

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

关于c++ - 不同的文件有不同的范围吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41302522/

相关文章:

c++ - haskell FFI : Interfacing with simple C++?

java - 与 jnpout32pkg/jnpout32reg 的并口通信

c++ - 在 Linux 上使用 C++ 检测唤醒计算机

c++ - 两个 bb 之间的重叠分数

c++ - 将函数放入 vector 并执行

c++ - 点燃 SqlFieldsQuery 特定键

c++ - 德州仪器数字信号处理器 : interfacing C++ and assembly

c++ - 在编译时或静态分析期间强制执行 std::nothrow

c++ - 什么是 std::allocator,我为什么需要它?

c++ - 如何找出依赖项中存在某个库的特定版本的原因?