我有一个C ++代码,它是一个物理模拟工具。
我想存储一些物理常量,不同单位集之间的转换因子,还有一些特定于应用程序的常量(如enum Planes {X=0, Y=1}
之类的定义),我希望能够从任何地方访问它们在我的代码中。
最好的方法是什么?
我认为一种方法是使用嵌套命名空间(如“常量”,“单位”等)创建命名空间namespace constants
(可以是我的主命名空间中的嵌套命名空间)。
你会这样做吗?
如果我使用该方法,是否必须将其作为头文件并将其包含在任何地方?
如果我理解正确,全局范围内命名空间中的变量具有static
链接,但没有external
链接。然后,如果我想在不包含文件的情况下使用它们,我还必须声明它们extern
?
你可以看到我对此感到有点困惑......
答案 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。