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

vin*_*nux 5 c preprocessor-directive

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

test.c的

#ifdef MYCHECK
    // do other sutff
#else
    // do stuff
#endif
Run Code Online (Sandbox Code Playgroud)

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

nicetool -D MYCHECK *.c
Run Code Online (Sandbox Code Playgroud)

会导致:

test.c的

// do other stuff
Run Code Online (Sandbox Code Playgroud)

Sha*_*our 8

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

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

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

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

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

不能在任何情况下处理多个物理行(因为注释或反斜杠 - 换行符).

Trigraphs无法识别.

在源文件的不同点上不支持具有不同定义的宏.

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

其他选项包括Sunifdef,其主站点已不再可用且自2008年以来未更新,而Coan:C预处理器Chainsaw将其描述为:

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

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