在哪里放置全局域特定常量(以及如何)?

时间:2010-09-13 14:04:38

标签: c++

我有一个C ++代码,它是一个物理模拟工具。

我想存储一些物理常量,不同单位集之间的转换因子,还有一些特定于应用程序的常量(如enum Planes {X=0, Y=1}之类的定义),我希望能够从任何地方访问它们在我的代码中。

最好的方法是什么?

我认为一种方法是使用嵌套命名空间(如“常量”,“单位”等)创建命名空间namespace constants(可以是我的主命名空间中的嵌套命名空间)。

你会这样做吗?

如果我使用该方法,是否必须将其作为头文件并将其包含在任何地方?

如果我理解正确,全局范围内命名空间中的变量具有static链接,但没有external链接。然后,如果我想在不包含文件的情况下使用它们,我还必须声明它们extern

你可以看到我对此感到有点困惑......

3 个答案:

答案 0 :(得分:2)

如果编译器没有说出任何关于它无法识别的信息,那么你就是安全的。重要的是编译器知道在哪里找到变量。包含头文件后,从技术上讲,它是该文件中代码的复制和粘贴。鉴于此,您需要执行一些预编译器指令。

#ifndef _MYGLOBALS
#define _MYGLOBALS

int global_integer;
long global_long;

#endif

这确保它们只包含一次,并且您的代码中不会有很多变量引用。

答案 1 :(得分:2)

在大多数情况下,命名空间常量是可行的方法。

  

如果我使用该方法,是否必须将其作为头文件并将其包含在任何地方?

是的,或者不是在任何地方,只是在它真正使用过的地方。

  

如果我理解正确,全局范围内命名空间中的变量具有静态链接,但没有外部链接。那么如果我想在不包含文件的情况下使用它们,我还必须将它们声明为extern?

是的,你必须这样做:

// header 

namespace modulename
{
  // maybe add another namespace to specify that you have constants, but taste-dependant

   namespace domain // like maths or physics
   {
        extern const Number THIS_NUMBER; // have to be defined in the cpp
        extern const int THAT_NUMBER = 256; // if it's int-based type, you can define it -here - BUT DON'T IF IT CAN BE CHANGED : all files including this one would have to be recompiled at each value change!!
   }
}

// .cpp, where you have the definitions

namespace modulename
{
   namespace domain // like maths or physics
   {
        const Number THIS_NUMBER = Number( 256.42f ); // definition - static is implicit
   }
}

答案 2 :(得分:1)

我会创建一个常量命名空间,并在那里放入所有与全局相关的常量。任何只与单个类相关的常量,在类本身中声明为静态consts。