C ++命名空间在其他人使用的单独文件中

时间:2012-03-28 16:55:21

标签: c++ namespaces include

我一直发现我经常想为程序提供一组“全局”参数 - 由不同文件中的许多不同类使用的变量分别编译。我想将这些参数保持在一起,简洁易懂,如

namespace Params {
    static int WindowHeight = 600;
    //...etc.
};

但是,如果包含它来制作a.o和b.o,“静态”会使这些变量在每个.o文件中都是本地的,而不是让它们保持共享,而“静态”则会导致多个定义。 另一种选择是创建一个静态类,如

class Params {
  public:
    static int WindowHeight;
    //...etc.
}

但是你必须在其他地方单独初始化参数:

int Params :: WindowHeight = 600;

这是我真的想避免的。 我甚至会接受类似下面的内容(顺便说一句,这对我不起作用)

namespace Params {
    static int WindowHeight
#ifdef __MUST_INIT_PARAMS
    = 600
#endif
    ;
};

只要每个条目都可以保存到一个地方。

有什么想法吗?任何形式的帮助都会很棒! 谢谢!

5 个答案:

答案 0 :(得分:1)

如果所有参数都是编译时已知的整数,则可以使用enum

namespace Params {
  enum e {
    WindowHeight = 600,
    // etc.
  };
}

用法:

  InitWindow(Params::WindowHeight);

答案 1 :(得分:0)

您需要使用extern代替static 在cpp文件中定义一次。

<强> // Filename.h

namespace Params 
{
    extern int WindowHeight;
};

定义其中一个cpp文件
// Filename.cpp

namespace Params 
{
    int WindowHeight = 100;
};

答案 2 :(得分:0)

首次使用static会声明一个特定于包含标题的每个翻译单元的变量。在类中,static表示一个全新的东西 - 它声明了一个类范围的变量。

要在命名空间内定义全局变量,您需要使用extern

//header.h
namespace Params {
    extern int WindowHeight;
};

//definition.cpp
namespace Params
{
    int WindowHeight = 600;
}

答案 3 :(得分:0)

你需要这样做:

//Params.h

namespace Params {
    extern int WindowHeight;  //it is declaration
};

然后在.cpp文件中:

//Params.cpp

 #include "Params.h" //not needed!

namespace Params {
    int WindowHeight = 600;  //it is definition
};

答案 4 :(得分:0)

如上所述,您需要使用extern而不是静态。如果您希望声明和定义在同一个文件中,那么使用extern的最后一次尝试将起作用:

namespace Params {
    extern int WindowHeight
#ifdef __MUST_INIT_PARAMS
    = 600
#endif
    ;
};