2013-02-05 68 views
0

我有包括限制范围

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++风格这样做?

回答

1

如果这些变量只用于main(),那么是的,你可以做到这一点。但我会而不是去考虑它是一个“正确的C++风格”。

如果有一天,你会最终包括头文件到另一个翻译单位(也许是因为你将需要共享只是一个这些变量的),连接器将开始抱怨多个定义

在这一点上,为了克服这一点,你可以使用关键字来给这些变量内部链接和解决多个定义的问题。然而,这样一来,每个翻译单元(.cpp文件)都会保留它自己的拷贝这些变量,这可能不是你想要的,特别是如果它们是不是常量 - 只是为了记录,全局常量有内部链接默认情况下,所以你不需要明确地将它们限定为static

这里通常的做法是要么离开这些变量定义在main(),或有一个头只包含extern声明这些变量的,以及包含其定义一个翻译单元。然后,所有需要访问这些变量的文件只需要在声明中导入标题。

+1

使用**'static'替代**,他**而不是** _would_ **将它们放入** namespace {/ * definitions * /} **之类的匿名名称空间**中。 – ipc

+0

@ipc:如果你介意我格式化我的答案,并认为它没有粗体和斜体的可读性,请随意编辑它。除了提高可读性以外,我不会这样做。 –

1

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

1

如果你所说的变量是全局变量private为main,我认为你应该让它们在main.cpp中。如果他们没有在别的地方使用,那么在头文件中声明它们是没有意义的

您也可以创建一个实现“私有”变量的“主要”功能的类,以便它们不会被其他部分的实施。