是否有跨平台方式来检测调试模式编译?

时间:2013-07-07 03:19:16

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

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

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

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

1 个答案:

答案 0 :(得分:6)

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

由于NDEBUG宏实际上影响了生成代码的语义(并且某些库在定义宏时是否更改了它们的ABI),这可能是您问题的最便携式答案。但是,如果您正在使用该宏来便携地检测优化构建,那么您可能会获得好坏参与。