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

Determine optimization level in preprocessor?

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

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

我相信这不可能直接知道用于编译软件的优化级别,因为这不在 the list of defined preprocessor symbols

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

但是,我认为更好的做法是在您的项目中拥有一套系统范围的本地符号,并让用户明确选择要使用的符号。:

  • MYPROJECT_DNDEBUG
  • MYPROJECT_OPTIMIZE
  • MYPROJECT_OPTIMIZE_AGGRESSIVELY

这使得 release/debug 之间的调试或行为差异变得更加容易,因为您可以逐步改变 on/off 不同的行为。

我不知道这是否是聪明的 hack,但它确实是 hack。

$ 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 那个。

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

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