一般来说,我偶尔会有一系列嵌套的宏,它们的定义中有一些预处理器条件元素。这些调试起来会很痛苦,因为很难直接看到正在执行的实际代码。
不久前,我隐约记得找到了一个编译器 (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。您可以在 Suns 的文档中找到更多信息。