【问题标题】:How to get rid of ifdef's in a large c project如何在大型 c 项目中摆脱 ifdef
【发布时间】:2012-01-30 13:11:33
【问题描述】:

我接触了一个用 C 编码的开源项目。它使用#ifdef 进行交叉编译。源代码中有很多 ifdef。我只想为一个平台修改它。我正在考虑通过编译器的预处理器(Visual C++)运行它,但它会将预处理结果写入一个我不需要的文件。任何人都知道一种预处理项目的方法,使其结构保持不变(所有文件都保持不变)?请不要使用 grep。

编辑:

我找到了一个潜在的解决方案(这些天你在互联网上能找到的东西真是太棒了)。它是 boost.wave - 一个 C++ 预处理器库,可以做一些有趣的事情。我不知道结果如何,但我会试一试。不过,这不是最终的答案,所以如果你有解决方案,我会很高兴听到的。

【问题讨论】:

  • 您为什么要这样做?可读性?为什么不让#ifdefs 保留,这样如果你想分享你的修改,它仍然会交叉编译。
  • @j-a 我在 main.c 文件中计算了 250 个 ifdef。对我理解所有正在发生的事情来说,这真的是一个问题。另外,我只想将特定于平台的代码添加到项目中。
  • 为什么不允许使用正则表达式?
  • 我想到了完美的解决方案,直到我读到你的最后一句话。
  • 我的系统上有 grep。和 Perl。和 Python。如果没有这些基本工具,人们如何完成任何事情?

标签: c visual-c++ c-preprocessor conditional-compilation


【解决方案1】:

据我所知,有两个工具可以用来半自动完成此操作。

一个是sunifdefunifdef 的儿子)。 AFAIK,尽管它不再被维护(unifdef 也不是它所基于的)。

另一个是coan,正在积极维护中,是sunifdef的开发。

另请参阅:Is there a C pre-processor which eliminates #ifdef blocks based on values defined/undefined?

碰巧的是,我仍在工作中的主要项目中使用sunifdef,我正在从代码库中删除过时的代码(例如,自 1996 年以来不支持的机器)。我唯一的问题是,如果一行带有这样的括号:

#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 VM 来清理代码。
  • 我查看了网站,发现也支持windows 7(甚至64位)。
【解决方案2】:

注释掉/删除#include 指令,对其进行预处理,恢复包含。

当然,您需要确保 #ifdef 使用的所有宏都可用。

【讨论】:

  • 不错。我会记住这种处理单个文件的技术。
猜你喜欢
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2021-02-10
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
相关资源
最近更新 更多