我有C ++的情况,我需要:
1)为在对象模块中声明/定义的名称空间中的静态const变量定义“默认”值
2)允许几个“主”程序使用“自定义”值“覆盖”这些值
每个“main”程序都有自己的构建文件夹和自己的对象模块副本,因此“主”程序完全相互独立:
e.g。
/mainProgramA/build/mainProgramA.o
/mainProgramA/build/Module.o
/mainProgramB/build/mainProgramB.o
/mainProgramB/build/Module.o
同样,在任何时候,都将定义/声明默认值或自定义值,但不能同时定义/声明两者。如果编译器“找到”自定义值,则将使用它们,否则将使用默认值。
我不能使用没有命名空间的弱符号,因为我需要命名空间来避免命名冲突。我不能在命名空间中使用弱符号,因为我得到“错误:弱的声明......必须公开”。我也许可以使用一个类,但是所有的值在编译时都是已知的而不是变量。最简单,最优雅的方法是什么?
澄清一下,我正在尝试做这样的事情:
DefaultValues.h:
namespace ConfigParams {
static const int param1 = 1;
static const int param2 = 2;
}
CustomValues.h:
namespace ConfigParams {
static const int param1 = 100;
static const int param2 = 200;
}
module.h中:
#include "DefaultValues.h"
class Module {
public:
static void printParam1();
}
Module.cpp:
#include "Module.h"
void Module::printParam1()
{
printf("%d\n", param1);
}
mainUsingDefaultValues.cpp(将链接在module.o的副本中,其中param1 == 1):
#include "Module.h"
...
Module::printParam1(); // Should print "1"
mainUsingCustomValues.cpp(将链接在module.o的副本中,其中param1 == 100):
#include "CustomValues.h"
#include "Module.h"
...
Module::printParam1(); // Should print "100"
答案 0 :(得分:2)
// File: CustomValues.h
#define MY_CUSTOM_VALUES
namespace ConfigParams
{
static const int param1 = 100;
static const int param2 = 200;
}
// File: DefaultValues.h
#ifndef MY_CUSTOM_VALUES
namespace ConfigParams
{
static const int param1 = 1;
static const int param2 = 2;
}
#endif
如果需要,可以使其更加灵活。
编辑:以防万一我误解了这个问题。这样,您的图书馆用户将被默认为DefaultValues.h
,除非他们在CustomValues.h
之前包含Module.h
。你可以有一个或另一个,但不能两者兼得。
#include "Module.h"
#include "CustomValues.h"
将无法编译,因为您将重新定义常量。
只是为了确保,您还需要在CustomValues.h
中加入Module.cpp
。因此,最好在#ifdef
内进行Module.h
切换,并在任何#define MY_CUSTOM_VALUES
包含之前将用户Module.h
置于某处:
// File: Module.h
#include "My_Constants.h" // #define MY_CUSTOM_VALUES can go here
#ifdef MY_CUSTOM_VALUES
#include "CustomValues.h"
#elif
#include "DefaultValues.h"
#endif
class Module
{
public:
static void printParam1();
}
// End of Module.h
// File: Module.cpp
#include "Module.h"
void Module::printParam1()
{
printf("%d\n", ConfigParams::param1);
}
// End of Module.cpp