代码库中用于移除/应用#ifdef和#else的工具

11

我有一个相当庞大的代码库,想要通过移除和应用一些分散其中的 ifdef 来清理它。例如,我有很多类似这样的:

test.c

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

有没有一种工具可以让我遍历整个代码库,并删除所有的代码,只留下我的变量条件中的代码?例如:

nicetool -D MYCHECK *.c

会导致:

test.c

// do other stuff

1个回答

19
看起来unifdef是你想要的,它也被用于Linux内核。这是来自链接网站的工具描述(我的强调):

unifdef实用程序有选择地处理条件C预处理器#if和#ifdef指令 。它从文件中删除指令和它们定界的附加文本,但不影响其他部分。

当研究使用#ifdef进行可移植性的代码时,它对于避免干扰很有用:我的初始动机是理解xterm的pty处理代码。它可以用作轻量级预处理器;例如,Linux内核使用unifdef从导出到用户区的标头中去除#include KERNEL部分。您可以将unifdef与其他语言一起使用;例如,我所在剑桥的UIT出版社使用LaTeX的unifdef。

如果查看手册,则BUGS部分列出了一些异常情况:

逐行处理意味着无法在每种情况下处理跨越多个物理行的预处理器指令(因为注释或反斜杠-换行符)。

三字符序列不被识别。

不支持在源文件中不同位置具有不同定义的宏。

文本模式和忽略功能与现代cpp(1)行为不对应。

其他选项包括Sunifdef,其主要网站已不再提供,并自2008年以来未更新,以及Coan:C预处理器链锯,它将自己描述为:

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

对于具有大量代码库且不断发展的产品的开发人员来说,Coan非常有用,其中使用预处理器定义和#if-指令来区分产品的连续发布或并行变体。在这些环境中,产品配置树的维护可能会变得困难,并且与配置相关的缺陷的发生可能会变得昂贵。


1
请查看建议的重复问题;sunifdefunifdef之子)和coan也是可选项。 - Jonathan Leffler
@JonathanLeffler 有趣,看起来 sunifdef 不再维护了,但 coan 看起来很有意思。 - Shafik Yaghmour
Coan应该替换sunifdef。我已经使用sunifdef多年了,没有任何问题(在一些极其扭曲的#ifdef代码中),没有任何问题。 Coan是一个更为进展的工作,所以我没有使用它 - 但是几年前我最后一次使用Coan,所以它可能已经改善了。 - Jonathan Leffler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接