限制标头中变量的范围

时间:2013-02-05 18:17:22

标签: 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中的代码量(为了清晰度问题)。我正在寻找一种方法来在某种类型的标题中声明这些变量,但是它只能在main.cpp中看到。

是否正确理解,如果我将它们放在例如vars_main.h(没有外部关键字)并且只包含“vars_main.h”,那么我已经实现了我的目标?

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

如果你所谈论的变量是main的私有变量,我认为你应该让它们在main.cpp中。如果它们没有在其他任何地方使用,那么在标题

中声明它们是没有意义的

您还可以使用私有范围内的变量创建一个实现“主要”功能的类,以便实现的其他部分不会使用它们。

答案 2 :(得分:1)

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

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

此时,为了克服这一点,您可以使用static关键字为这些变量提供内部链接,并解决多个定义的问题。但是,这样,每个翻译单元(.cpp文件)都会拥有自己的副本这些变量,这可能不是您想要的,特别是如果它们不是常数< / em> - 仅为记录,默认情况下全局常量具有内部链接,因此您无需将它们明确限定为static

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