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

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


#define指令存储在内存宏中;
递归地遵循#include指令;
#if#ifdef指令中评估条件;
禁止在#if .. #else .. #endif块的不活动部分中使用代码;
(可选)删除/* .. *///注释;
删除所有剩余的指令行。


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

这听起来很奇怪,但是我有充分的理由。我有一系列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然后将忽略标准头文件。

关于c++ - 预处理器保留宏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13514517/

10-13 08:19