是否有一种方法来逃避C预处理器指令
Is there a way to escape a C preprocessor directive?
我要做的是让C预处理器输出#ifdef
, #else
和#endif
指令。也就是说,我想以某种方式"转义"一个指令,以便预处理器的输出包括预处理器在输出上运行的指令。
是否有可能"转义"CPP指令,以便它由预处理器输出,这样转义指令的输出将是预处理器指令,如果CPP输出本身要预处理?
在GNU cpp 4.4.3上,Marcelo Cantos的回答对我有用:
#define HASH(x) x
...
HASH(#)ifdef __cplusplus
class foo { };
HASH(#)endif
EDIT:下面的答案似乎只适用于cpp
的早期版本。它介于4.2.1和4.3.2之间。gcc -E
和g++ -E
更早地实现收支平衡。详情见注释
这里有一个似乎有效的技巧:
#define HASH() #
...
HASH()ifdef __cplusplus
class foo { };
HASH()endif
您必须直接使用cpp
,因为编译器将尝试立即使用预处理器输出,并且不知道如何处理未处理的指令。
另一个似乎有效的技巧是:
#define EMPTY
EMPTY#ifdef
使用GCC的预处理器(版本4.5.2),我得到:
<>之前# ifdef之前由于某种原因,该技术与Ilmari Karonen的解决方案有相同的前置空间问题,但这可能不是符合现代标准的C预处理器的问题。
相关文章:
- 错误:无效的预处理指令 #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 - 无法输出预处理文件
- 在海湾合作委员会中加快宏观预处理的任何方法
- Xmllint未设置,而在路径中找不到XMLLINT;跳过XML预处理
- 如何在预处理时读取文件