我正在做一个巨大的项目,它使用一个系统,当运行make时,生成一些头文件,其中包含一些常量,这些常量在代码中随处可见。由于该项目的规模,如果其中一个头文件被更改(删除一个常量或添加另一个常量),几乎整个项目都必须重新编译(有时需要几个小时)。
我最初的解决方案是编写某种类型的ConstantManager
类,该类具有每个代码-值对的映射,以及一个getter方法,它将给定的代码作为字符串返回其值来返回(相当直接),并更改头生成器,以便它将常量定义为#define
,扩展为ConstantManager
的实例并调用getter。这样做的问题是它不能与switch
语句一起工作(好吧……case
语句),因为返回值不是常量表达式。
我的问题是:这个问题有没有替代的解决方案,或者让我的交换机工作的技巧?
发布于 2014-06-10 13:27:08
您可以将大标题拆分为较小的标题,并包括这些标题。这可能是大量的初始工作,但这是最直接的,并且可能与您当前的解决方案兼容。
另一种选择是创建,以使您的ConstManager类具有常量表达式成员。为此,您不需要太多,但您不能使用map。
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";
https://stackoverflow.com/questions/24140792
复制相似问题