【发布时间】:2016-02-15 12:14:34
【问题描述】:
我在使用 g++ 编译第 3 方库时遇到了一些预处理故障。
我可以在-E 输出中看到某个用#ifndef SYMBOL 包裹的标头正在被绕过。显然,该符号已在其他地方定义。
但我看不到在哪里,因为在 -E 输出中不存在已处理的指令。
有没有办法将它们包括在内(可能是 cmets)?
【问题讨论】:
标签: g++ c-preprocessor
我在使用 g++ 编译第 3 方库时遇到了一些预处理故障。
我可以在-E 输出中看到某个用#ifndef SYMBOL 包裹的标头正在被绕过。显然,该符号已在其他地方定义。
但我看不到在哪里,因为在 -E 输出中不存在已处理的指令。
有没有办法将它们包括在内(可能是 cmets)?
【问题讨论】:
标签: g++ c-preprocessor
不,没有将预处理指令作为 cmets 的标准方法。
但是,您可以使用 g++ -C -E 和行号(以 # 开头的行输出)和 cmets(然后将其复制到预处理的表单中)。
您也可以使用-H 选项(获取包含的文件)
【讨论】:
我找到的最接近的是-d<chars> 系列选项:
-dM 转储所有定义的宏-dD 显示它们的定义位置(转储 #define 指令)-dU 显示它们的使用位置(代替#if(n)def,它输出#define 或#undef,具体取决于是否定义了宏)
将I 添加到其中任何一个也会转储#include 指令。
缺点是一次只能使用三个中的一个,它们会抑制正常输出。
另一个不太容易理解的缺点是 -dD 和 -dU 不包含预定义的宏。
【讨论】: