是否有跨平台的方式来检测调试模式编译?如果没有,那么如何为顶级编译器做到这一点;MSVC、GNU & MINGW、mac、clang、英特尔。
例如 MSVC,您可以检测如下调试模式。
#if defined _DEBUG
// debug related stuff here
#else
// release related stuff here
#endif
是否有跨平台的方式来检测调试模式编译?如果没有,那么如何为顶级编译器做到这一点;MSVC、GNU & MINGW、mac、clang、英特尔。
例如 MSVC,您可以检测如下调试模式。
#if defined _DEBUG
// debug related stuff here
#else
// release related stuff here
#endif
对于许多或大多数编译器,“调试”模式是一个多方面的概念,包括几个正交设置。例如,使用gcc
,您可以使用 向输出代码添加调试符号,使用-g
启用优化,或使用(定义宏)-O
禁用宏。在我的工作中,我们部署了启用或禁用这些的许多组合的生产代码。我们已经离开,以便附加到正在运行的进程并使用它们进行故障排除(在这种情况下,我们通常不得不与意大利面作斗争assert()
-DNDEBUG
NDEBUG
-g
gdb
-O
产生),保留断言以获取有关跨版本持续错误的更多信息,并禁用对在“未定义行为”的更宽松解释下编写的遗留代码库的优化(直到我们可以修复/替换它)。
由于NDEBUG
宏实际上会影响生成代码的语义(并且某些库在定义或未定义宏时会更改其 ABI),因此这可能是您问题的最便携的答案。但是,如果您使用该宏来检测可移植的优化构建,您可能会取得好坏参半。
下面的代码应该可以工作:
#ifdef defined DEBUG || defined _DEBUG
#else
#endif