c++ - 有没有跨平台的方法来检测 Debug模式编译?

标签 c++ c++11 macros c-preprocessor

是否有跨平台的方法来检测 Debug模式编译?如果没有,那么顶级编译器如何做; MSVC、GNU 和 MINGW、mac、clang、intel。

例如 MSVC,您可以像下面这样检测 Debug模式。

#if defined _DEBUG
// debug related stuff here
#else
// release related stuff here
#endif

最佳答案

对于许多或大多数编译器来说,“调试”模式是一个多方面的概念,包括几个正交设置。例如,对于 gcc,您可以使用 -g 将调试符号添加到输出代码,使用 -O 启用优化,或禁用 assert() 宏使用 -DNDEBUG(定义 NDEBUG 宏)。在我的工作中,我们已经部署了启用或禁用这些功能的许多组合的生产代码。我们保留了 -g 以便附加到正在运行的进程并使用 gdb 对其进行故障排除(在这种情况下我们通常不得不与意大利面条 -O produced),保留断言以获取有关跨版本持续性错误的更多信息,并禁用对根据更宽松的“未定义行为”解释编写的遗留代码库的优化(直到我们可以修复/替换它)。

由于 NDEBUG 宏实际上会影响生成代码的语义(并且某些库会在定义或未定义宏时更改其 ABI),这可能是对您的问题最便携的答案。但是,如果您使用该宏来检测可移植的优化构建,您可能会取得不同程度的成功。

关于c++ - 有没有跨平台的方法来检测 Debug模式编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17508954/

相关文章:

c++ - 读取数据 cv::Mat

c++ - 所有不同质数的和等于 100

c++ - 通过 C++ 运行外部 .exe

c++ - 如何使用 Qt5 编写 C++11?

c++ - std::is_signed 不适用于强类型枚举:int

c++ - 就功能而言,c++11 range-for 不等于 classic for 吗?

c++ - 导入QtQuick.Window 2.2 QML模块未找到

macros - 构建评估的评估是否等于宏观?

keyboard - 在 Windows 中编程的最佳键盘宏是什么?

c - 是否有可能将类似 Lisp 的宏构建成命令式语言?