c++ - 限制 header 中变量的范围

标签 c++ scope header-files

我有一个包含多个文件的程序

main.cpp
ext1.cpp
ext2.cpp
ext3.cpp
vars.h

顾名思义,main.cpp是主文件,extX.cpp包含各种函数,vars.h是一些全局常量。

然而,在 main.cpp 中也有(一些!)变量声明,但它们必须只在 main.cpp 的范围内——这就是为什么我没有将它们放在 vars.h 中

我想减少 main.cpp 中的代码量(为了清楚起见)。我正在寻找一种在某种 header 中声明这些变量的方法,但它只对 main.cpp 可见。

是否正确理解如果我将它们全部放在里面,例如vars_main.h(没有外部关键字)并且只包含“vars_main.h”,那么我就达到了我的目标吗?

这样做是否被认为是“正确的”C++ 风格?

最佳答案

如果这些变量仅在 main() 中使用,那么是的,您可以那样做。但我不会认为它是“正确的 C++ 风格”。

如果有一天您最终将该头文件包含到另一个翻译单元中(可能是因为您只需要共享这些变量中的一个),链接器将开始提示多个定义

那时,为了克服这个问题,您可以使用static 关键字为这些变量提供内部链接并解决多重定义的问题。然而,这样一来,每个翻译单元(.cpp 文件)将拥有自己的那些变量的拷贝,这可能不是您想要的,尤其是当它们是not constant - 仅作记录,默认情况下全局常量具有内部链接,因此您无需将它们显式限定为 static

这里通常的做法是将这些变量定义留在 main() 中,或者有一个仅包含 extern declarations 的 header 这些变量,以及一个包含它们的定义的翻译单元。然后,所有需要访问这些变量的文件只需导入带有声明的 header 。

关于c++ - 限制 header 中变量的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14714175/

相关文章:

c++ - QGraphicsPixmapItem 不显示在 QGraphicsView 中

Javascript:for 循环 'for(i=0; i < 3 ; i++)' 在没有使用 continue、break 或 return 的情况下过早终止

objective-c - 是否可以在与在 Objective-C 中使用它的类头文件相同的文件中定义枚举?

c++ - 头文件和c++文件的问题

C++ 类型 'double' 和 'const char [5]' 到二进制 'operator+' 的无效操作数

c++ - 在哪里使用 boost::asio 实现协议(protocol)?

c# - C# 中委托(delegate)的作用域

c++ - 位置未处理的异常:Microsoft C++ 异常:内存位置的 std::length_error

c++ - 已调用 WM_TIMER 消息但未设置计时器

跨模块的 Python 作用域/命名空间