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