2013-07-07 18 views
3

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

例如MSVC可以检测调试模式如下所示。

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

标准说,如果'NDEBUG'被定义,则assert'的'的定义将是什么(这实际上意味着“释放模式”)。您可能可以检查'#ifndef NDEBUG'来获取想要的行为。 – Xeo

+0

调试版本和发布版本在MSVC之外没有很好的定义。为什么不问谁在使用你的代码来定义什么时候他们正在调试呢? –

回答

6

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

由于NDEBUG宏实际上会影响生成的代码的语义(并且某些库在宏定义或不定义时会更改它们的ABI),所以这可能是对您的问题最可移植的答案。但是,如果您正在使用该宏来轻松检测优化构建,那么您可能会取得混合成功。

相关问题