11

MSVC_DEBUG在调试模式下定义,gccNDEBUG在发布模式下定义。我可以在 clang 中使用什么宏来检测代码是为发布还是调试而编译?

4

4 回答 4

10

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

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

于 2013-10-28T13:10:21.353 回答
6

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

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

于 2013-10-28T13:11:12.760 回答
4

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

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

于 2016-07-18T02:39:06.060 回答
2

命令行编译器中没有调试模式之类的东西。这是 IDE 的事情:它只是设置了一些要发送到编译器的选项。

如果你clang从命令行使用,你可以使用任何你想要的。也是如此gcc,所以如果gcc你使用NDEBUG,你可以使用相同的。

于 2013-10-28T13:11:29.197 回答