从源

时间:2017-04-10 16:11:20

标签: c-preprocessor

如何有效地计算出能够提供相同代码的最小宏定义组合列表?宏列表是事先已知的。

目标是编译较少版本的程序(可能是着色器),从而通过了解哪些宏组合是等效的来跳过一些编译时间。 例如。如果使用MACRO_A和MACRO_B构建的程序与仅使用MACRO_A构建的程序相同。

为了简单起见,这些宏是定义与否,它们的值无关紧要(意味着没有#if SOMEMACRO)。

例如:

#ifdef A
  #ifdef B
    // some code
  #endif
  // some code
#elif defined(C)
 // some code
#else
  // some code
#endif

生成所有程序的一个简单方法是使用从A,B和C组成的所有组合进行编译。这意味着创建2 ^ 3 = 8种组合。但是,只有以下组合才有用(!表示未定义宏,~宏无关紧要,可以定义或未定义):

  • ( A, B, ~C)(与A,B,C和A,B,!C相同)
  • ( A, !B, ~C)
  • (!A, ~B, C)
  • (!A, ~B, !C)

这意味着只编译具有以下定义的程序就足够了:

  • A B
  • A
  • C
  • 没有定义

通过这个列表,我知道当被要求使用(A, !B, C)组合的程序时,我可以简单地使用仅使用A定义的程序。

可以使用哪些工具?

注意:

  • 大多数预处理器只会为给定的一组定义
  • 提供路径
  • 也许构建预处理器的控制流图会有帮助吗?
  • J. Trull对clang here做了一些工作,为AST添加条件节点,但似乎是针对重构,不确定它是否是最好的方法

0 个答案:

没有答案