0

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

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

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

但是不能在输出中替换宏。或者,预处理器可以将不应替换的宏名称列表作为参数。

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

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

4

2 回答 2

2

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

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

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

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

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

于 2012-11-22T14:31:59.263 回答
0

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

grep -R . '#define'

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

于 2012-11-22T14:25:39.663 回答