处理编辑头文件时的编译时间

Dealing with compilation times when editing headers

本文关键字:编译 时间 文件 编辑 处理      更新时间:2023-10-16

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

我最初的解决方案是编写某种ConstantManager类,该类具有每个代码值对的映射和getter,该getter返回给定代码作为字符串返回其值(非常直接),并且还更改头生成器,以便将常量定义为扩展到ConstantManager实例的#define s和对getter的调用。这样做的问题是它不适用于switch语句(嗯……(实际上是case语句),因为返回值不是常量表达式。

我的问题是:有没有其他的解决方案来解决这个问题,或者有一些技巧来让我的开关工作?

您可以将大标题拆分为较小的标题并包含它们。这可能是大量的初始工作,但这是最直接的,并且可能与您当前的解决方案兼容。

另一个选择是创建使你的ConstManager类有constexpr成员。为此,您不需要太多,但不能使用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;

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

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

  1. 如果这些定义用于连接字符串,它将不起作用
  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";