4

是否有跨平台的方式来检测调试模式编译?如果没有,那么如何为顶级编译器做到这一点;MSVC、GNU & MINGW、mac、clang、英特尔。

例如 MSVC,您可以检测如下调试模式。

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

2 回答 2

6

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

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

于 2013-07-07T14:34:32.423 回答
-1

下面的代码应该可以工作:

#ifdef defined DEBUG || defined _DEBUG

#else

#endif
于 2021-12-14T12:09:04.860 回答