如何在一个大型C语言项目中消除#ifdef条件编译

6
我得到了一个使用C编写的开源项目。它使用#ifdef进行交叉编译。源代码中到处都有很多ifdef。我只想修改它以适应一个平台。我考虑通过编译器的预处理器(Visual C++)运行它,但它会将预处理结果写入单个文件,这不是我需要的。有人知道一种在保留结构完整的情况下预处理项目的方法吗(所有文件都完好无损)?请勿使用grep。
编辑:
我找到了一个潜在的解决方案(现在互联网上可以找到很多惊人的东西)。这是boost.wave - 一个C++预处理器库,可以做一些有趣的事情。我不知道它会变成什么样子,但我会尝试一下。不过,这还不是最终答案,如果您有解决方案,我很乐意听取。

7
为什么要这样做?可读性吗?为什么不让#ifdef保持不变,这样如果你想共享你的修改,它仍然可以跨编译。 - j-a
1
@j-a 我数了一下 main.c 文件里共有 250 个 ifdef。这真的让我很难理解所有事情的发生。而且我只想将特定于平台的代码添加到项目中。 - ilcredo
3
我之前有一个完美的解决方案,直到我看到了你最后一句话。 - Philip
@RichardPennington 我认为它不会。 - ilcredo
2
我的系统上有grep。还有Perl和Python。如果没有这些基本工具,任何人如何完成工作? - David Heffernan
显示剩余8条评论
2个回答

6
我知道两个可以半自动化完成此任务的工具。
一个是sunifdefunifdef的后代)。据我所知,它已经不再被维护了(sunifdef基于其构建的unifdef也是如此)。
另一个是coan,它正在积极维护,并且是sunifdef的发展。
另请参阅:是否有一种C预处理器可以根据已定义/未定义的值消除基于#ifdef的块?
恰巧,在我从代码库中清除过时代码(例如,自大约1996年以来不支持的机器)的工作主项目上,我仍在使用sunifdef。唯一需要注意的是,如果一行输入时有括号,就像这样:
#if (defined(MACH_A) && defined(PROP_P)) || (defined(MACH_B) && defined(PROP_Q)) || \
    (defined(MACH_C) && defined(PROP_R))

我们有-UMACH_C(因此不再支持 C 机器),输出行为:

#if defined(MACH_A) && defined(PROP_P) || defined(MACH_B) && defined(PROP_Q)

从技术上讲,这是正确的;它是正确的。只是最好在表达式中保留额外的、技术上多余的括号。

一个警告:虽然我可以回答这些在基于Unix的系统上编译的问题,但我个人没有在Windows上检查过它们。


很好有这样的工具。既然它能够运行,我可以设置一个Linux虚拟机来清理代码。 - ilcredo
我正在查看网站,发现它也支持Windows 7(包括64位)。 - ilcredo

3

将#include指令注释掉/移除,进行预处理,然后恢复这些指令。

当然,您需要确保#ifdef使用的任何宏都是可用的。


好的。我会记住这个处理单个文件的技巧。 - ilcredo

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