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

标签 c++ g++ preprocessor

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

Error: expected class-name before "{" token

Error: "QMutex" does not name a type

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

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

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

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

最佳答案

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

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

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

关于c++ - 检查预处理器符号的值(#define),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48376758/

相关文章:

c++ - C 中的 cin.ignore() 等价于什么?

c++ - TCP 客户端消息处理

c++ - <<method name>> 未在此范围内为私有(private)静态方法声明

java - 使用注释创建 API 的多个版本

C - 关于字符串的预处理器声明

c - 为什么某些预处理器宏不展开,除非它们是另一个宏的参数?

c++ - 识别矩阵变量分配的行为

c++ - "-ftrapv"和 "-fwrapv": Which is better for efficiency?

c++ - gcc/g++ 替代定义

c - c 中的内存损坏