C++ 什么预定义宏可用于检测带有叮当声的调试生成?

C++ 什么预定义宏可用于检测带有叮当声的调试生成?,c++,debugging,clang,C++,Debugging,Clang,MSVC在调试模式下定义\u DEBUG,gcc在发布模式下定义NDEBUG。在clang中,我可以使用什么宏来检测代码是为发布还是调试而编译?如果查看IDE的项目设置,您将看到这些宏实际上是手动定义的,而不是由编译器自动定义的。事实上,编译器无法真正知道它是在构建“调试”还是“发布”,它只是根据用户(或IDE)提供给它的标志进行构建 您必须创建自己的宏并手动定义它们,就像IDE在创建项目时为您所做的那样。编译器不定义这些宏。您的IDE/Makefile/可以。这并不取决于编译器,而是取决于您使

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

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


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

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


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

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


如果在命令行中使用
clang
,则可以使用任何需要的内容。这同样适用于
gcc
,因此如果使用
gcc
使用
NDEBUG
,您可以使用相同的方法。

您可以使用
\uuuuuuu优化\uuuu
标志来确定是否正在进行优化。这通常意味着它不是调试构建,因为优化通常会重新排列代码序列。尝试单步执行优化代码可能会让人困惑


这可能是那些对这个问题最感兴趣的人真正想弄明白的

请看一看:Visual Studio还使用默认项目设置为发布版本定义了
NDEBUG
。编译器可以通过一种方法知道它是调试还是发布版本标志,这是特定于一种模式还是另一种模式的。类似于gcc/clang的
-g
。但似乎您是对的,当使用
-g
调用时,clang没有定义任何额外的宏。太糟糕了@VioletGiraffe不是真的,您可以使用调试信息创建“发布版本”,或者使用优化创建“调试版本”。第一种情况(将调试信息添加到“发布”版本)有时非常有用。无论采用哪种方式,当使用
-g
调用编译器时自动定义的宏都会起到作用。@VioletGiraffe
-g
编译器选项仅表示生成调试信息。不幸的是,gcc将这些信息编译成二进制文件,使其看起来像是编译过程的一部分。MSC做了正确的事情,只是生成了一个符号数据库(pdb)文件,使区别更容易看到。这与调试构建无关——它只允许从崩溃转储中获取人类可读的信息。我假设每个人都会为发布的软件生成调试信息。这样就可以了!这与优化本身无关;
DEBUG
NDEBUG
和类似的宏通常用于将不应出现在最终生产版本中的代码插入到调试版本中。比如额外的错误检查。但由于生产构建几乎总是经过优化的,因此这确实是区分两者的一个好方法。