Section outline

  • <setjmp.h> – 非局部跳转(Non-Local Jumps)

    标准 C 要求 jmp_buf 是一个足够大小的数组,用于存储“当前程序上下文”(不管具体包含什么)。
    C99 补充说明:该上下文不包括浮点状态标志的状态、已打开的文件、或抽象机器的任何其他组件的状态。

    C++ 注意事项:对应的标准 C++ 头文件为 <csetjmp>


    保存调用环境(Save Calling Environment)

    setjmp

    标准 C 规定:“不指定 setjmp 是宏还是具有外部链接的标识符(函数)。
    如果为了访问实际函数而屏蔽了宏定义,或程序自行定义了名为 setjmp 的外部标识符,行为是未定义的。”

    如果在标准 C 所定义的上下文之外调用 setjmp,其行为也是未定义的


    恢复调用环境(Restore Calling Environment)

    longjmp 函数

    • 如果 longjmp 尝试恢复到一个从未由 setjmp 保存过的上下文,其结果是未定义的

    • 如果 longjmp 恢复到的上下文中,其最初调用 setjmp 的函数已经结束返回,其结果也是未定义的

    • 如果在嵌套的信号处理程序中调用 longjmp,行为是未定义的

    • 不要在退出处理程序中调用 longjmp,例如那些通过 atexit 注册的处理函数中。