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

标签 c++ namespaces

我在 C++ 中遇到一个情况,我需要:

1) 在对象模块中声明/定义的命名空间中为静态常量变量定义一个“默认”值

2) 允许多个“主要”程序使用“自定义”值“覆盖”这些值

每个“主”程序都有自己的构建文件夹和自己的目标模块拷贝,因此“主”程序彼此完全独立:

例如

/mainProgramA/build/mainProgramA.o
/mainProgramA/build/Module.o
/mainProgramB/build/mainProgramB.o
/mainProgramB/build/Module.o

此外,在任何时候,都会定义/声明默认值或自定义值,但不会同时定义/声明两者。如果编译器“找到”自定义值,将使用它们,否则将使用默认值。

我不能在没有 namespace 的情况下使用弱符号,因为我需要 namespace 来避免命名冲突。我不能在 namespace 中使用弱符号,因为我收到“错误:...的弱声明必须公开”。我也许可以使用一个类,但所有的值在编译时都是已知的,而不是可变的。执行此操作最简单、最优雅的方法是什么?

澄清一下,我正在尝试做这样的事情:

默认值.h:

namespace ConfigParams {
    static const int param1 = 1;
    static const int param2 = 2;
}

自定义值.h:

namespace ConfigParams {
    static const int param1 = 100;
    static const int param2 = 200;
}

模块.h:

#include "DefaultValues.h"
class Module {
public:
    static void printParam1();
}   

模块.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"

最佳答案

// 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,除非他们在 Module.h 之前包含 CustomValues.h。您可以拥有一个或另一个,但不能同时拥有两者。

#include "Module.h"
#include "CustomValues.h"

不会编译,因为您将重新定义常量。

为了确保,您还需要在 Module.cpp 中包含 CustomValues.h。因此,可能最好在 Module.h 中创建一个 #ifdef 开关,并在任何 Module 之前的某处设置用户 #define MY_CUSTOM_VALUES .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

关于c++ - 命名空间中变量的默认/自定义值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8877938/

相关文章:

c++ - 统一处理返回 void 的方法和返回值的方法

c++ - 无法从 'const std::reverse_iterator<_RanIt> &' 推断出 'std::string' 的模板参数

c++ - 原子 int 不正确地递增?英特尔 TBB 实现

Java - JRadioButton 名称的 Action 监听器

c# - 到处获取 "<kml:...",更新 Kml 文件

c++ - 可以在两个不同的命名空间中声明同一个实体吗?

java - 如何从java调用C#函数

c++ - 为什么我的 C++ 扩展存储过程不写入控制台?

php - Laravel 如何将 Facades 放置在全局和自定义命名空间中?

c# - 获取没有完整命名空间的类型名称