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

Posted

技术标签:

【中文标题】从代码库中删除/应用 ifdef/else 的工具【英文标题】:Tool to remove/Apply ifdef's/else's from codebase 【发布时间】:2014-03-30 00:50:13 【问题描述】:

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

test.c

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

是否有一种工具可以让我运行整个代码库并删除所有代码,只保留变量条件中的代码?例如:

nicetool -D MYCHECK *.c

会导致:

test.c

// do other stuff

【问题讨论】:

Is there a C pre-processor which eliminates #ifdef blocks based on values defined/undefined?的可能重复 【参考方案1】:

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

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

在研究大量使用 #ifdef 以实现可移植性的代码时,它有助于避免分心:我最初的动机是了解 xterm 的 pty 处理代码。它可以作为一个轻量级的预处理器; 例如,Linux 内核使用 unifdef 从它导出到用户空间的标头中去除 #ifdef _KERNEL_ 部分。您可以将 unifdef 与 C 以外的语言一起使用;例如 UIT,我居住的剑桥的一家出版商,使用 unifdef 和 LaTeX。

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

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

不能在每种情况下处理多个物理行(由于 cmets 或反斜杠换行符)。

无法识别三合字母。

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

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

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

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

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

【讨论】:

查看建议的重复问题; sunifdefunifdef 的儿子)和coan 也是选项。 @JonathanLeffler 很有趣,看起来 sunifdef 不再被维护,但 coan 看起来很有趣。 Coan 应该替换 sunifdef。我已经使用 sunifdef 多年没有问题(在一些极度扭曲的#ifdef 代码的老鼠巢中)没有问题。 Coan 是一项正在进行中的工作,所以我没有使用它——但我上一次与 Coan 合作是几年前,所以从那时起它可能已经有所改进。

以上是关于从代码库中删除/应用 ifdef/else 的工具的主要内容,如果未能解决你的问题,请参考以下文章

verilog 条件编译命令`ifdef`else`endif 的应用

我在 moviepy 库中的 cutout() 工具遇到问题。 cutout() 工具从视频末尾删除音频

错误代码:从 SharePoint 文档库中删除文件时出现 3604

#ifdef #endif

#ifdef #endif

从库中删除文件后如何从 Xcode 中删除引用?