从代码库中删除/应用ifdef' s / else的工具

时间:2014-03-30 00:50:13

标签: c preprocessor-directive

我有一个非常大的代码库,我想通过删除并应用散布在它周围的一些ifdef来清理它。例如,我有很多这些:

test.c的

#ifdef MYCHECK
    // do other sutff
#else
    // do stuff
#endif

是否有一个工具允许我运行整个代码库并删除所有代码,只留下我的变量条件中的代码?例如:

nicetool -D MYCHECK *.c

会导致:

test.c的

// do other stuff

1 个答案:

答案 0 :(得分:7)

unifdef 看起来像你想要的,它也用在Linux kernel中。这是链接网站(强调我的)中工具的描述:

  

unifdef实用程序有选择地处理条件C预处理器#if和#ifdef指令。它从文件中删除指令和它们分隔的附加文本,否则将文件单独留下。

     

在研究使用#ifdef进行大量可移植性的代码时,避免分心是很有用的:我最初的动机是理解xterm的pty处理代码。它可以用作轻量级预处理器; 例如,Linux内核使用unifdef从导出到用户空间的标题中删除#ifdef _ KERNEL _部分。您可以将unifdef与C以外的语言一起使用;例如UIT,我居住的剑桥的出版商,使用Unifdef与LaTeX。

如果您查看manual,则BUGS部分列出了一些例外情况:

  

一次处理一行意味着预处理器指令分开

     

在任何情况下都无法处理多个物理行(因为注释或反斜杠换行符)。

     

无法识别三维图形。

     

不支持具有不同定义的宏        源文件中的点。

     

text-mode和ignore功能与现代不对应        cpp(1)行为。

其他选项包括Sunifdef ,其主网站不再可用且自2008年以来未更新,Coan: The C Preprocessor Chainsaw将其描述为:

  

Coan是一个软件工程工具,用于分析基于预处理器的C或C ++源代码配置。它的主要用途是通过消除与指定配置相关的任何冗余部分来简化源代码体。死代码删除是这种应用程序。

     

Coan对于具有大型代码库的不断发展的产品的开发人员最有用,其中使用预处理器定义和#if-directive来区分产品的渐进式版本或并行变体。在这些设置中,产品配置树的维护可能变得困难,并且配置相关缺陷的发生可能变得昂贵。