【问题标题】:Preprocessor keeping macros预处理器保留宏
【发布时间】:2012-11-22 14:12:40
【问题描述】:

我想预处理 C++ 头文件保留输出文本中的所有宏。

为此,我需要一个类似于 C 预处理器的程序来执行这些任务:

  • 将来自#define 指令的宏存储在内存中;
  • 递归地遵循#include指令;
  • 评估#if#ifdef 指令中的条件;
  • 抑制#if .. #else .. #endif 块的非活动部分中的代码;
  • (可选)删除/* .. */// cmets;
  • 删除所有剩余的指令行。

但宏不得在输出中被替换。或者,预处理器可以在参数中接收不应被替换的宏名称列表。

这听起来可能很奇怪,但我有充分的理由。我有一系列能够分析预处理 C++ 类头的 Perl 脚本。我使用一些宏来告诉他们例如要导出哪些方法。

我还没有找到能够执行我需要的预处理程序,所以我写了一个 Perl 脚本。后者实际上有效,但速度慢且不标准。我正在寻找更好的选择。

【问题讨论】:

    标签: c++ c-preprocessor


    【解决方案1】:

    使用gcc -E 手动运行预处理器。这将扩展所有宏,但这不是问题。

    当您需要 Perl 脚本的输出时,您需要的是特殊的宏。试试这个:

    #ifdef PERL_PREPROCESSING
    # define EXPORT(...) PERL_EXPORT
    #else
    # define EXPORT(...) ...normal C code...
    #endif
    

    所以想法是你调用gcc -E -DPERL_PREPROCESSING 来切换一些宏来产生你的perl 脚本可以定位的输出。宏将照常展开。

    [编辑]如果您不想使用特定于 Perl 的宏来污染源代码,请使用以下技巧:创建一个文件夹,其中包含带有宏的 Perl 版本的头文件并包含此文件夹位于所有其他带有-I 的文件夹之前。然后gcc 将忽略标准头文件。

    【讨论】:

      【解决方案2】:

      如果你使用 *nix,你可以使用 grep 命令查找目录中的所有#defines

      grep -R . '#define'
      

      对于所需的预处理,使用 gcc -E。

      【讨论】:

      • gcc -E 将替换宏!而且我不是在搜索宏定义,而是在搜索宏的用法。
      猜你喜欢
      • 2011-05-06
      • 2015-04-15
      • 1970-01-01
      • 1970-01-01
      • 2015-07-31
      • 1970-01-01
      • 2010-09-19
      • 2020-02-09
      相关资源
      最近更新 更多