确定预处理器中的优化级别?
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__
的值。
-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__
的值。