编辑标题时处理编译时间

时间:2014-06-10 12:18:23

标签: c++ c++11

我正在开发一个庞大的项目,该项目使用的系统在运行make时会生成一些头文件,其中包含一些在代码中无处不在的常量。由于这个项目的大小如果其中一个标题被更改(一个常量被删除或另一个被添加),几乎整个项目必须重新编译(有时需要几个小时)。

我的初始解决方案是编写某种ConstantManager类,其中包含每个代码 - 值对的映射,以及返回给定代码作为字符串返回其值(相当直接)的getter,以及更改标头生成器,以便将常量定义为#define s,扩展为ConstantManager的实例并调用getter。这个问题是它不能用于switch语句(实际上是...... case语句),因为返回值不是常量表达式。

我的问题是:是否有任何替代解决方案可以解决这个问题或者使用交换机来解决这个问题?

1 个答案:

答案 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;

提出的第一个解决方案(这是在第一次编辑之前):

我认为您应该用常规外部变量替换所有定义。

虽然有两点需要注意:

  1. 如果这些定义用于连接字符串
  2. ,则无效
  3. 如果编译器不是不可能的话,它可能会更难以内联,但如果这只是一个分析器可以说明的话。
  4. <强> 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";