确定预处理器中的优化级别?

时间:2015-07-30 08:22:32

标签: c gcc gdb compiler-optimization c-preprocessor

-Og是一个相对较新的优化选项,旨在改善应用优化时的调试体验。如果用户选择-Og,那么我希望我的源文件激活备用代码路径以增强调试体验。 GCC提供__OPTIMIZE__ preprocessor macro,但只有在优化生效时才设置为1。

有没有办法了解优化级别,例如-O1-O3-Og,以便与预处理器一起使用?

3 个答案:

答案 0 :(得分:8)

我认为无法直接了解用于编译软件的优化级别,因为这不在the list of defined preprocessor symbols

您可以依赖-DNDEBUG(无调试),用于禁用发布代码中的断言并启用您的" debug"在这种情况下的代码路径。

但是,我认为更好的办法是在项目中使用系统范围的符号集,让用户选择明确使用的符号。

  • MYPROJECT_DNDEBUG
  • MYPROJECT_OPTIMIZE
  • MYPROJECT_OPTIMIZE_AGGRESSIVELY

这使得调试或发布/调试之间的行为差​​异变得更加容易,因为您可以逐步打开/关闭不同的行为。

答案 1 :(得分:8)

我不知道这是否是聪明的黑客,但这是黑客。

$ gcc -Xpreprocessor -dM -E - < /dev/null > 1
$ gcc -Xpreprocessor -dM -O -E - < /dev/null > 2
$ diff 1 2
53a54
> #define __OPTIMIZE__ 1
68a70
> #define _FORTIFY_SOURCE 2
154d155
< #define __NO_INLINE__ 1

clang没有产生FORTIFY。

答案 2 :(得分:0)

存在一些特定于系统的预处理器宏,具体取决于您的目标。例如,特定于 Microchip 的 gcc XC16 变体(当前基于 gcc 4.5.1)具有预处理器宏 __OPTIMIZATION_LEVEL__,其取值为 0、1、2、s 或 3。

请注意覆盖特定例程的优化,例如使用 __attribute__((optimize(0))),不会更改该例程中 __OPTIMIZE____OPTIMIZATION_LEVEL__ 的值。