保留宏的预处理器

Preprocessor keeping macros

本文关键字:处理器 预处理 保留      更新时间:2023-10-16

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

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

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

但是宏不能在输出中被替换。或者,预处理器可以接受一个不应被替换的宏名称列表。

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

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

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

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

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

因此,我们的想法是调用gcc -E -DPERL_PREPROCESSING来切换一些宏,以生成perl脚本可以定位的输出。宏将像往常一样展开。

[EDIT]如果您不想用Perl特定的宏污染您的源代码,请使用此技巧:创建一个包含带有Perl版本的宏的头文件的文件夹,并将此文件夹放在带有-I的其他文件夹之前。gcc将忽略标准头文件。

如果您使用*nix,您可以使用grep命令在目录中查找所有#定义

grep -R . '#define'

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