在使用setjmp/longjmp时,需要注意编译器对其的特殊处理。具体来说,编译器可能会将setjmp/longjmp的调用与函数调用进行优化,导致程序出现异常行为。
为了避免这种情况,可以使用__attribute__((noinline))来禁止编译器对函数进行优化。具体使用方法如下(以gcc编译器为例):
#include
#include
__attribute__((noinline)) // 禁止编译器对函数进行优化
void foo(jmp_buf buf, int val) {
printf("enter foo\n");
longjmp(buf, val); // 直接跳转到setjmp处
}
int main(void) {
jmp_buf buf;
int val = 1;
if (setjmp(buf)) {
printf("back to main function\n");
} else {
printf("call foo function\n");
foo(buf, val);
}
return 0;
}
在编译时加上-O2优化选项,程序可能会出现预期之外的行为。但是如果加上__attribute__((noinline)),编译器就不会再对foo函数进行优化,从而避免出现问题。