【发布时间】:2010-09-11 12:11:49
【问题描述】:
一般来说,我偶尔会有一个嵌套宏链,它们的定义中有一些预处理器条件元素。这些调试起来很痛苦,因为很难直接看到正在执行的实际代码。
不久前,我隐约记得找到了一个编译器 (gcc) 标志来扩展它们,但我在实践中遇到了麻烦。
【问题讨论】:
-
重新标记 gcc,基于内容
一般来说,我偶尔会有一个嵌套宏链,它们的定义中有一些预处理器条件元素。这些调试起来很痛苦,因为很难直接看到正在执行的实际代码。
不久前,我隐约记得找到了一个编译器 (gcc) 标志来扩展它们,但我在实践中遇到了麻烦。
【问题讨论】:
gcc -E 将预处理后的源输出到标准输出。
【讨论】:
对于 MSVC 用户,您可以右键单击文件/项目,查看设置并将文件属性更改为输出预处理源(通常在 obj 目录中)。
【讨论】:
这可能不适用于您的情况,但宏确实会妨碍调试,并且经常被过度使用且可以避免。
你能用内联函数替换它们还是把它们一起去掉?
【讨论】:
您可能应该开始远离宏并开始使用内联和模板。
宏是一个旧工具,有时是正确的工具。作为最后的手段,记住 printf 是你的朋友(实际上 printf 在你做多线程的时候并不是那么糟糕的朋友)
【讨论】:
使用加载的符号调试反汇编。
【讨论】:
gcc -save-temps 将写出一个 .i(或 C++ 的 .ii 文件),它是 C 预处理器的输出,然后将其交给编译器。这通常很有启发性。
【讨论】:
GCC 和兼容的编译器使用 -E 选项将预处理的源输出到标准输出。
gcc -E foo.cpp
Sun Studio 也支持这个标志:
CC -E foo.cpp
但更好的是 -xdumpmacros。您可以找到更多信息in Suns' docs.
【讨论】: