命名空间中变量的默认值/自定义值

时间:2012-01-16 09:29:26

标签: c++ namespaces

我有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"

1 个答案:

答案 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
相关问题