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

时间:2018-01-22 07:45:44

标签: c++ g++ preprocessor

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

  

错误:“{”标记

之前的预期类名

  

错误:“QMutex”未命名类型

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

[1]在所有编译器中并不严格如此,为了准确地解决宏使得很难遵循代码实际执行的问题,现代编译器在正确解析代码期间扩展宏。但是,显然这在特定情况下并没有帮助。