可以使用什么预定义宏来检测使用clang的调试版本?

时间:2013-10-28 13:06:29

标签: c++ debugging clang

MSVC在调试模式下定义_DEBUG,gcc在发布模式下定义NDEBUG。我可以在clang中使用什么宏来检测代码是否正在编译以进行发布或调试?

4 个答案:

答案 0 :(得分:9)

如果查看IDE的项目设置,您会看到这些宏实际上是在那里手动定义的,它们不会由编译器自动定义。实际上,编译器无法实际知道它是在构建“调试”还是“发布”,它只是根据用户(或IDE)提供给它的标志构建。

您必须制作自己的宏并手动定义它们,就像IDE在创建项目时为您所做的那样。

答案 1 :(得分:6)

编译器不定义这些宏。您的IDE / Makefile / <insert build system here>可以。这不依赖于编译器,而是依赖于您使用的环境/构建帮助程序。

约定是在调试模式下定义DEBUG宏,在发布模式下定义NDEBUG宏。

答案 2 :(得分:3)

您可以使用__OPTIMIZE__标志来确定是否正在进行优化。这通常意味着它不是调试版本,因为优化通常会重新排列代码序列。尝试逐步优化代码可能会令人困惑。

这可能是那些对这个问题最感兴趣的人真正想要弄清楚的。

答案 3 :(得分:2)

命令行编译器中没有调试模式这样的东西。这是一个IDE的东西:它只是设置了一些发送给编译器的选项。

如果您从命令行使用clang,则可以使用您想要的任何内容。对于gcc也是如此,因此如果gcc使用NDEBUG,则可以使用{{1}}。