使用 setjmp 和 longjmp

da*_*911 2 c setjmp

有这么简单的C代码

#include <stdio.h>
#include <setjmp.h>

void Com_Error(int);

jmp_buf abortframe;

int main() {
    
    if (setjmp (abortframe)){
        printf("abortframe!\n");
        return 0;           
    }
    
    Com_Error(0);
    
    printf("main end\n");    
    return 0;
}

void Com_Error(int code) {
    // ...
    longjmp (abortframe, code);
    //...
}
Run Code Online (Sandbox Code Playgroud)

我越来越:

中止帧!

我的问题是为什么它会打印abortframe!if we pass 0(NOT ) ,因此不应该满足true条件,所以没有打印字符串?if (setjmp (abortframe)){...}abortframe!

Lun*_*din 5

阅读友好手册(C17 7.13.2.1):

longjmp 函数不能导致 setjmp 宏返回值 0;如果 val 为 0,则 setjmp 宏返回值 1。