我正在开发一个庞大的项目,该项目使用的系统在运行make时会生成一些头文件,其中包含一些在代码中无处不在的常量。由于这个项目的大小如果其中一个标题被更改(一个常量被删除或另一个被添加),几乎整个项目必须重新编译(有时需要几个小时)。
我的初始解决方案是编写某种ConstantManager
类,其中包含每个代码 - 值对的映射,以及返回给定代码作为字符串返回其值(相当直接)的getter,以及更改标头生成器,以便将常量定义为#define
s,扩展为ConstantManager
的实例并调用getter。这个问题是它不能用于switch
语句(实际上是...... case
语句),因为返回值不是常量表达式。
我的问题是:是否有任何替代解决方案可以解决这个问题或者使用交换机来解决这个问题?
答案 0 :(得分:0)
您可以将巨大的标题拆分为较小的标题并包含这些标题。这可能是很多初步工作,但是最直接的,可能与您当前的解决方案兼容。
另一种选择是创建使您的ConstManager类具有constexpr成员。为此你不需要太多,但你不能使用地图。
<强> ConstManager.h 强>
namespace ConstManager {
namespace detail {
struct Constant {
char const * const name;
char const * const value;
};
Constant const * const constants;
unsigned int total_variables;
}
inline char const * const ConstManager::get(char const * needle) constexpr {
using namespace ConstManager::detail;
/* i was not able to quickly find a constexpr compatible binary search function*/
if(int i = 0; i < total_variables; ++i){
Constant & const c = constants[i];
if(strcmp(c.name, needle) == 0){
return c.value;
}
}
return nullptr;
}
}
应该生成ConstManager.c
ConstManager::detail::Constant ConstManager::detail::constants [] = {
{"first var", "first value"},
{"second var", "second value"}
};
unsigned int ConstManager::detail::total_variables = 2;
提出的第一个解决方案(这是在第一次编辑之前):
我认为您应该用常规外部变量替换所有定义。
虽然有两点需要注意:
<强> constmgr.h 强>
// make all your needed constansts externs
namespace Constants {
extern int const theFirstConstant;
extern char const * const someStringConstant;
}
然后在构建时生成源文件。
<强> constexpr.cpp 强>
int const Constants::theFirstConstant = 1000;
char const * const Constants::someStringConstant = "hihihoho";