GCC支持returns_twice属性需要哪些编译器,setjmp
和fork
等glibc函数需要?
我已经看到returns_twice
函数无法内联并且需要发出有关寄存器clobbering的警告的语句,但我找不到编译器需要如何实现它的清晰描述。
答案 0 :(得分:1)
returns_twice
的行为取决于编译器实现的优化。例如,如果编译器具有可以消除以下片段中local
变量的读取的优化(假设从未采用其地址,那么setjmp
通常不能更新它) ,它需要知道setjmp
可以自发返回,因此在这种情况下它不会应用优化:
static int local;
static doit (void)
{
jmp_buf jmp;
local = 0;
if (setjmp (jmp) != 0)
return local;
local = 1;
longjmp (jmp, 1);
local = 0;
return 0;
}
(奇怪的是,如果你将local
转换为全局寄存器变量,GCC会不这样做。也许是一个错误。)