某些时候显式的在Makefile中定义了-O0,但是调试时仍然会出现print变量<optimized out>。主要原因是因为编译过程中链接的方式,导致当前文件仍然是旧的非O0方式,或者被其他Makefile先编译出的.o中间文件仍然是带O2优化的。
为了避免被优化,可以显示的针对某些函数或某些文件关闭优化。
#pragma GCC push_options
#pragma GCC optimize ("O0")
...your code...
#pragma GCC pop_options
另外一种方式,可以直接使用宏定义,为函数添加属性来控制
#ifdef DEBUG
#define OPTIMIZE_ZERO __attribute__ ((__optimize__ ("-O0")))
#else
#define OPTIMIZE_ZERO
#endif
OPTIMIZE_ZERO int func(void)
{
......
}
此处提及2个很有用的属性,可以控制全局变量的初始化和析构(c语言中并没有析构函数,此时可以利用destruct来析构全局变量)
//在main之前运行
__attribute__((constructor))
//在exit之前运行
__attribute__((destructor))