通常,我偶尔会有一系列嵌套宏,其定义中包含一些预处理器条件元素。这些可能很难调试,因为很难直接看到正在执行的实际代码。
前一段时间我依旧记得找到一个编译器(gcc)标志来扩展它们,但是我在实践中遇到这个问题时遇到了麻烦。
答案 0 :(得分:14)
gcc -E会将预处理的源输出到stdout。
答案 1 :(得分:8)
对于MSVC用户,您可以右键单击文件/项目,查看设置并更改文件属性以输出预处理源(通常位于obj目录中)。
答案 2 :(得分:5)
这可能不适用于您的情况,但宏确实妨碍了调试,并且经常被过度使用和避免。
您可以使用内联函数替换它们或以其他方式将它们全部删除吗?
答案 3 :(得分:2)
您可能应该开始远离Macros并开始使用内联和模板。
宏是一种旧工具,有时候是正确的工具。作为最后的手段,记住printf是你的朋友(实际上,当你做多线程的东西时,printf并不是一个好朋友)
答案 4 :(得分:1)
使用加载的符号调试dissasembly。
答案 5 :(得分:1)
gcc -save-temps 在将它传递给编译器之前,它将写出一个.i(或C ++的.ii文件),它是C预处理器的输出。这通常很有启发性。
答案 6 :(得分:0)
GCC和兼容的编译器使用-E选项将预处理的源输出到标准输出。
gcc -E foo.cpp
Sun Studio也支持此标记:
CC -E foo.cpp
但更好的是-xdumpmacros。您可以找到更多信息in Suns' docs.