MSVC在调试模式下定义_DEBUG
,gcc在发布模式下定义NDEBUG
。我可以在clang中使用什么宏来检测代码是否正在编译以进行发布或调试?
答案 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}}。