【问题标题】:Is there a good general method for debugging C++ macros?是否有调试 C++ 宏的通用方法?
【发布时间】:2010-09-11 12:11:49
【问题描述】:

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

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

【问题讨论】:

  • 重新标记 gcc,基于内容

标签: c++ debugging gcc macros


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 支持提示,但我必须说,每个处理的文件比自己通过宏更糟糕(特别是如果宏跨越多行)。出于某种原因,有数万行,其中大部分空白行填满了文档。
    【解决方案3】:

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

    你能用内联函数替换它们还是把它们一起去掉?

    【讨论】:

    • 谢谢;好建议。我问不是因为特定情况,而是因为我过去在这方面遇到了麻烦,并且对未来有更多的期待。我维护的大部分代码(大部分不是我编写的)都广泛使用宏,因此能够调试它们仍然很有用。
    • 我投了赞成票,但不幸的是,我们中的许多人都需要知道这些信息,因为我们只能调试那些懒惰、无能或认为经常和大量使用宏是“好”的人使用的宏设计”。
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

          gcc -E foo.cpp
          

          Sun Studio 也支持这个标志:

          CC -E foo.cpp
          

          但更好的是 -xdumpmacros。您可以找到更多信息in Suns' docs.

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-10-14
            • 2011-01-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多