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

C 确定预处理器中的优化级别?,c,gcc,gdb,compiler-optimization,c-preprocessor,C,Gcc,Gdb,Compiler Optimization,C Preprocessor,-Og是一个相对较新的优化选项,旨在提高应用优化时的调试体验。如果用户选择-Og,则我希望源文件激活备用代码路径以增强调试体验。GCC提供了,但只有在优化生效时才将其设置为1 有没有一种方法可以学习用于预处理器的优化级别,如-O1、-O3或-Og?我认为这不可能直接知道编译软件时使用的优化级别,因为它不在 您可以依赖于-DNDEBUG(无调试),它用于禁用发布代码中的断言,并在这种情况下启用“调试”代码路径 但是,我认为更好的做法是在项目本地设置一组系统范围的符号,并让用户明确选择要使用的符号

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


有没有一种方法可以学习用于预处理器的优化级别,如
-O1
-O3
-Og

我认为这不可能直接知道编译软件时使用的优化级别,因为它不在

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

但是,我认为更好的做法是在项目本地设置一组系统范围的符号,并让用户明确选择要使用的符号

  • MYPROJECT\u DNDEBUG
  • MYPROJECT\u优化
  • MYPROJECT\u积极优化\u

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

我不知道这是否是一个聪明的黑客,但它是一个黑客

$ 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
$gcc-Xpreprocessor-dM-E-1
$gcc-Xpreprocessor-dM-O-E-2
$diff 12
53a54
>定义优化1
68a70
>#定义_加强_来源2
154d155
<#定义uu否u内联uuu 1

clang没有生成强化宏。

根据您的目标,存在一些特定于系统的预处理器宏。例如,gcc的特定于微芯片的XC16变体(目前基于gcc 4.5.1)具有预处理器宏
\uuuuu优化\uuuuuu级别,其值为0、1、2、s或3


请注意,覆盖特定例程的优化,例如使用
\uuuuu属性((优化(0))
,不会更改该例程中的
\uuuu优化\uuuu
\uu优化级别\uuuu
的值。

谢谢。我认为这是不可能的。如果有人想出了一个聪明的(或明显的)黑客,我可能会重新考虑公认的答案。
glibc
的标题(特别是
/usr/include/features.h
)在设置
\u FORTIFY\u SOURCE
时查找
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuo>标志。另外,
\uuuuuu优化\uuuuuu
现在出现在上面的链接中。非常好的主意。。。“你自己看看吧!”。。。我不会想到的。那不是黑客,那是调查!一个衬里:
diff