【问题标题】:How to apply a C preprocessor only to certain (#if/#endif) directives?如何仅将 C 预处理器应用于某些 (#if/#endif) 指令?
【发布时间】:2014-09-30 01:23:28
【问题描述】:

我想知道这是否可能,如果可以,我可以在 C++ 源文件,只处理条件指令#if #endif 等。我想要其他 指令在输出文件中保持不变。

我正在对 C# 代码进行一些分析,但没有 C# 预处理器。我的想法是在 C# 文件上运行 C 预处理器并仅处理条件。这样,例如,#region 指令将保留 在文件中,但 cpp 似乎删除了#region。

【问题讨论】:

标签: c++ c-preprocessor


【解决方案1】:

您可能正在寻找像 coan 这样的工具:

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

它专门设计用于处理#if#ifdef 预处理器行,并相应地删除代码,但它还有很多其他可能的用途。

【讨论】:

  • 太棒了!看起来与我正在寻找的完全一样,但不幸的是它看起来不适用于 Mac OS。我现在正在尝试看看我是否可以编译它。得到一些错误。您是否在 Mac OS X 上尝试过,或者您知道 Mac 的其他替代方案吗?
  • @Ali,不,我没有 Mac 了。对不起。但是从 sourceforge 页面来看,该项目似乎处于活动状态,因此您可能需要通过电子邮件向开发人员发送电子邮件,说明您收到的编译错误。如果你有所有的先决条件,为 Mac OS X 编译包通常不会太难,fwiw。祝你好运。
  • 其中一个类中的迭代器类型似乎不兼容。我应该调查一下或联系开发人员。感谢您的帮助!
【解决方案2】:

linux unifdef 命令做你想做的事:

http://linux.die.net/man/1/unifdef

即使您不在 linux 上,网络上也有可用的源代码。

顺便说一句,这是另一个问题的重复:Way to omit undefined preprocessor branches by default with unifdef?

【讨论】:

    【解决方案3】:

    哦,这与我过去的任务相同。我尝试过 cpp unifdefcoan 工具——它们都偶然发现了特殊的 C# 预处理器,例如 #region。最后我决定自己做一个: https://github.com/gaDZella/undefine.

    与上述 cpp 工具相比,该工具有一组非常简单的选项,但它与 C# 预处理器语法完全兼容。

    【讨论】:

      【解决方案4】:

      您可以使用 g++ -E 选项在预处理阶段后停止

      -E -> 预处理阶段结束后停止。输出为预处理后的源代码形式,发送到标准输出

      【讨论】:

      • "..但是 cpp 似乎删除了#region",g++ 是否不管它?
      • @user2864740,区域特定于 vc++ 编译器,对吗?你是用vc++编译的吗?
      • #region 是 C# 支持的指令,因此如果希望分析 C# 文件,剥离它可能会有问题。 (我不是问这个问题的人。)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      • 2012-06-08
      • 2022-11-29
      • 2012-02-01
      相关资源
      最近更新 更多