C++ 限制标头中变量的范围

C++ 限制标头中变量的范围,c++,scope,header-files,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可见 如果我将它

我有一个多文件程序,包括

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++风格吗?

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

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

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


您还可以创建一个类来实现“main”功能,将您的变量放在私有范围内,这样它们就不会被实现的其他部分使用。

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


您还可以创建一个类,用私有范围中的变量实现“main”功能,这样它们就不会被实现的其他部分使用。

如果这些变量只在
main()
中使用,那么是的,您可以这样做。但我想< > < <强> >就可以认为它是“正确的C++风格”。 如果有一天你最终将该头文件包含到另一个翻译单元中(可能是因为你只需要共享其中一个变量),链接器将开始抱怨多个定义

此时,为了克服这个问题,您可以使用
static
关键字为这些变量提供内部链接,并解决多个定义的问题。但是,通过这种方式,每个转换单元(
.cpp
文件)将保存自己的这些变量的副本,这可能不是您想要的,特别是如果它们不是常量-仅为了记录,全局常量默认具有内部链接,因此您不需要显式地将它们限定为
静态


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

如果这些变量仅在
main()
中使用,则可以这样做。但我想< > < <强> >就可以认为它是“正确的C++风格”。 如果有一天你最终将该头文件包含到另一个翻译单元中(可能是因为你只需要共享其中一个变量),链接器将开始抱怨多个定义

此时,为了克服这个问题,您可以使用
static
关键字为这些变量提供内部链接,并解决多个定义的问题。但是,通过这种方式,每个转换单元(
.cpp
文件)将保存自己的这些变量的副本,这可能不是您想要的,特别是如果它们不是常量-仅为了记录,全局常量默认具有内部链接,因此您不需要显式地将它们限定为
静态


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

他不使用
static
,而是将它们封装在一个匿名名称空间中,如
名称空间{/*definitions*/}
@ipc:如果你介意我格式化我的答案,并且认为没有粗体和斜体更可读,请随意编辑它。除了提高可读性之外,我没有其他任何理由这样做。与其使用
静态
,他宁愿将它们封装在一个匿名名称空间中,比如
名称空间{/*definitions*/}
@ipc:如果你介意我格式化我的答案,并且认为没有粗体和斜体更可读,请随意编辑它。除了提高可读性之外,我没有其他原因。