限制标头中变量的范围

restricting scope of variables in headers

本文关键字:变量 范围      更新时间:2023-10-16

我有一个由组成的多文件程序

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

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

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

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

如果我把它们都放在vars_main.h(带有no外部关键字)里面,只包括"vars_main.h.",那么我就实现了目标,这一点正确吗?

这样做被认为是"正确的"C++风格吗?

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

如果有一天你将该头文件包含到另一个翻译单元中(可能是因为你只需要共享其中一个变量),链接器就会开始抱怨多个定义

此时,为了克服这一点,可以使用static关键字为这些变量提供内部链接,并解决多个定义的问题。然而,通过这种方式,每个转换单元(.cpp文件)都将拥有这些变量的自己的副本,这可能不是您想要的,尤其是如果它们不是常量-只是为了记录,全局常量默认情况下具有内部链接,因此您不需要明确地将它们限定为static

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

通常的做法是继续在main.cpp中定义它们,因为它们在一个不同的块中,不会影响代码的可读性。但是,您当然可以将它们移到一个单独的包含文件中,该文件只包含在一个.cpp中,这是一个完全取决于您的风格选择。

如果你谈论的变量是main私有的全局变量,我认为你应该让它们出现在main.cpp中。如果它们没有在其他地方使用,那么在头中声明它们是没有意义的

您还可以创建一个类来实现"main"特性,其中变量位于私有范围内,这样它们就不会被实现的其他部分使用。