13

一般来说,我偶尔会有一系列嵌套的宏,它们的定义中有一些预处理器条件元素。这些调试起来会很痛苦,因为很难直接看到正在执行的实际代码。

不久前,我隐约记得找到了一个编译器 (gcc) 标志来扩展它们,但我在实践中遇到了麻烦。

4

7 回答 7

14

gcc -E 将预处理的源输出到标准输出。

于 2008-09-19T23:39:31.290 回答
8

对于 MSVC 用户,您可以右键单击文件/项目,查看设置并将文件属性更改为输出预处理源(通常在 obj 目录中)。

于 2008-09-20T00:10:28.330 回答
5

这可能不适用于您的情况,但宏确实会妨碍调试,并且经常被过度使用和避免。

您可以将它们替换为内联函数或以其他方式将它们全部删除吗?

于 2008-09-20T00:11:38.297 回答
2

您可能应该开始远离宏并开始使用内联和模板。

宏是一个旧工具,有时是正确的工具。作为最后的手段,记住 printf 是你的朋友(实际上 printf 在你做多线程的事情时并不是那么糟糕的朋友)

于 2008-09-20T00:28:28.193 回答
1

使用加载的符号调试反汇编。

于 2008-09-20T00:03:50.110 回答
1

gcc -save-temps 将写出一个 .i(或 C++ 的 .ii 文件),它是 C 预处理器的输出,然后再交给编译器。这通常很有启发性。

于 2008-09-20T06:58:21.017 回答
0

GCC 和兼容的编译器使用 -E 选项将预处理的源输出到标准输出。

gcc -E foo.cpp

Sun Studio 也支持这个标志:

CC -E foo.cpp

但更好的是-xdumpmacros。您可以在 Suns 的文档中找到更多信息。

于 2008-09-20T06:10:10.230 回答