代码之家  ›  专栏  ›  技术社区  ›  Cedric H.

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

c++
  •  0
  • Cedric H.  · 技术社区  · 16 年前

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

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

    最好的方法是什么?

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

    你会这样做吗?

    如果我使用该方法,是否必须将其设置为头文件并将其包含在所有地方?

    如果我正确理解全局范围内命名空间中的变量 static 联动装置,但没有 external 联动装置。如果我想在不包括文件的情况下使用它们,我还必须声明它们 extern ?

    如你所见,我对此有点困惑…

    3 回复  |  直到 16 年前
        1
  •  2
  •   sbi    16 年前

    在大多数情况下,名称空间常量是一种方法。

    如果我使用该方法,是否必须将其设置为头文件并将其包含在所有地方?

    是的,或者不是到处都是,但只限于它真正被使用的地方。

    如果我正确理解全局范围内命名空间中的变量具有静态链接,但没有外部链接。那么,如果我想使用它们而不包括一个文件,我还必须声明它们是外部的吗?

    是的,你必须这样做:

    // 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
  •  2
  •   Jimmie Clark    16 年前

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

    #ifndef _MYGLOBALS
    #define _MYGLOBALS
    
    int global_integer;
    long global_long;
    
    #endif
    

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

        3
  •  1
  •   NeilDurant    16 年前

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