gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:30:10 25 4
gpt4 key购买 nike

我在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com