我想预处理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/