保留宏的预处理器
Preprocessor keeping macros
我想预处理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。
相关文章:
- 错误:无效的预处理指令 #i 的意思是 #if?
- C++预处理会生成变量成员、资源库和映射
- 使用预处理指令检查是否包含标头?
- 预处理的 C/C++ 文件是否特定于计算机?
- 使用 GCC 对 C 文件进行部分预处理(不删除 "define" 指令)
- 在 CPLEX 中求解线性规划,无需剪切和预处理
- CPP -D 选项,用于预处理 Fortran 代码
- 错误:粘贴"tmp_UINT"和"+"未提供有效的预处理令牌
- 任务计划程序库的预处理不起作用 - 多定义错误
- Eclipse 问题 - 编译期间不考虑 .c 和 .cpp 文件中定义的预处理
- 使用python预处理后,C++(opencv)中的垫子类型数据与image_to_array相同
- Howo 使用 cl 预处理为 masm 组装生成一个单独的文件
- 我有一个预处理的 C/C++ 源文件 (cacti.i).如何从这个 .i 文件生成可执行二进制文件,以便我可以像 ./
- 如何使用Visual Studio C/C++编译器(cl.exe)来预处理我的objective-C代码
- 是具有预处理前分支实现的结构违反ODR
- 与不完整的Cholesky预处理的共轭梯度返回特征库的意外错误
- Visual Studio C - 无法输出预处理文件
- 在海湾合作委员会中加快宏观预处理的任何方法
- 所有结构成员的预处理器批处理
- 当头文件被预处理时是否有一个预处理器选项显示?