-Og
是一个相对较新的优化选项,旨在改善应用优化时的调试体验。如果用户选择-Og
,那么我希望我的源文件激活备用代码路径以增强调试体验。 GCC提供__OPTIMIZE__
preprocessor macro,但只有在优化生效时才设置为1。
有没有办法了解优化级别,例如-O1
,-O3
或-Og
,以便与预处理器一起使用?
答案 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__
的值。