我一直发现我经常想为程序提供一组“全局”参数 - 由不同文件中的许多不同类使用的变量分别编译。我想将这些参数保持在一起,简洁易懂,如
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
;
};
只要每个条目都可以保存到一个地方。
有什么想法吗?任何形式的帮助都会很棒! 谢谢!
答案 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
;
};