检查预处理器符号的值(#define)

Checking value of preprocessor symbol(#define)

我正在尝试将应用程序交叉编译到另一个系统。我创建了所有依赖项并开始编译。这然后停止与我的依赖库之一,即 Qt3,导致编译器错误:

Error: expected class-name before "{" token

Error: "QMutex" does not name a type

我怀疑 Q_EXPORT 符号定义错误,因为我忘记模拟一些环境设置。但是因为它的定义依赖于符号依赖于符号依赖于符号等等,所以很难检查。

只是在测试程序中输出它也不起作用,因为 Q_EXPORT 的值并不总是可以转换为字符串。

我的问题是: 我如何使用 GNU 编译器检查预处理器符号的值 (while compiling/preprocessing)。

我以为会有一个选项,但我在网上搜索时没有找到任何东西。

宏符号的调试可能很棘手,因为它发生在实际编译之前 [1]。 运行 打印实际编译命令的构建系统是一个很好的起点。

然后你可以获取实际的编译命令,并将 -c 替换为 -E 或类似的东西,以检查实际生成的预处理器输出。然后找到您正在编译的源代码中的实际位置 - 期望 -E 的输出非常大 - 一百万行输出并不罕见。使用 #file 和 #line 预处理器符号来跟踪您所在的文件以及所在的行。

[1] 并非在所有编译器中都严格正确,为了帮助准确解决宏导致难以理解代码实际执行的问题,现代编译器在正确解析代码期间扩展宏。但是,这显然对这种特殊情况没有帮助。