首页 > 其他分享 >goto 语句以及 setjump、longjump 函数的注意事项总结

goto 语句以及 setjump、longjump 函数的注意事项总结

时间:2024-06-06 09:21:56浏览次数:11  
标签:语句 longjmp goto setjmp setjump 跳转 longjump 函数

关于 goto、setjmp、longjmp 的注意事项,总结如下:

goto语句

  1. 避免滥用
    • goto 语句虽然能够提供一种直接的跳转方式,但过度使用会使程序结构变得复杂,难以阅读和维护。应优先考虑使用结构化的控制流语句(如 if、while、for 等)。
  2. 防止死循环
    • 在使用 goto 语句时,要特别注意不要形成死循环。确保跳转目标不会导致无限循环,且应有明确的退出条件。
  3. 标签命名
    • 如果确实需要使用 goto,应给跳转标签起一个有意义的名字,以增加代码的可读性。

setjmp、longjmp 函数

  1. 执行顺序
    • 必须先调用 setjmp 函数来初始化 jmp_buf 结构体变量,然后才能调用 longjmp 函数进行跳转。违反这个顺序可能导致程序崩溃或不可预测的行为。
  2. 作用域限制
    • longjmp 函数的调用必须在 setjmp 函数的作用域之内。换句话说,longjmp 必须能够访问到 setjmp 初始化的 jmp_buf 变量。
  3. 资源清理
    • 使用 setjmp 和 longjmp 进行跳转时,需要注意资源的清理工作。因为这些跳转不是通过正常的函数调用和返回机制进行的,所以可能会跳过一些资源释放的代码段。
  4. 错误处理
    • longjmp 的第二个参数可以传递一个非零值给 setjmp 作为返回值,这个值可以用来指示错误类型或进行其他状态判断。
  5. 避免在动态内存管理中使用
    • 由于 setjmp 和 longjmp 可能会跳过内存分配或释放的代码,因此在涉及动态内存管理(如 malloc 和 free)的代码中要特别小心,以避免内存泄漏或双重释放等问题。
  6. 栈环境恢复
    • 当调用 longjmp 时,程序会恢复到最近一次调用setjmp时的栈环境。这意味着在 longjmp 之后的栈状态可能与预期不符,需要特别注意。
  7. 可移植性问题
    • setjmp 和 longjmp 在不同平台和编译器上的行为可能略有差异。在编写跨平台代码时,需要特别注意这些差异。

总的来说,无论是使用 goto 还是 setjmp、longjmp,都应谨慎行事,确保代码的可读性、可维护性和稳定性。在大多数情况下,更推荐使用结构化的异常处理机制或返回错误码的方式来处理异常情况。

更进一步地,可参见如下详细介绍:

  1. 禁止 goto 语句向嵌套的或无包含关系的作用域跳转
  2. 禁止 goto 语句向前跳转
  3. 禁用 goto 语句
  4. 禁用 setjmp、longjmp
  5. 不应存在不受条件控制的跳转语句
  6. 不应存在不改变程序流程的跳转语句
  7. 避免使用跳转语句退出循环

 

标签:语句,longjmp,goto,setjmp,setjump,跳转,longjump,函数
From: https://www.cnblogs.com/lucky-bubble/p/18234421

相关文章

  • goto语句
    今天给大家分享一个小知识----goto语句。goto语句就是可以随意无条件的转移语句,运用形式是:标记名:...        goto标记名;这两个中间可以写任意内容,标记名也可以在goto语句后面,位置随意。给大家分享一个好玩的例子:一个定时关机程序,输入我是小狗,取消关机,输......
  • c语言中的goto语句,goto语句的使用
    在c语言中,goto语句与分支语句if,switch不同,也和循环语句while,for,do...while不同,goto语句被称为无条件转移语句,也被称为转向语句,其实和break,return语句是同一个类型。goto语句的使用一般都需要一个again进行配合,当使用goto语句时,程序会转跳回again处重新运行again后的程序。got......
  • break、continue与goto关键字
    breakbreak在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句。(break语句也在switch语句中使用)代码举例publicclassBreakDemo{publicstaticvoidmain(String[]args){inti=0;while(i<1......
  • Java流程控制11:break、continue、goto
    breakcontinue1.break在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句。(break语句也在switch语句中使用)2.continue语句用在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否......
  • 跳转语句:包括break、continue和goto语句的作用和注意事项。
    跳转语句是一种在程序中改变代码执行顺序的语句。常见的跳转语句包括break、continue和goto语句。本文将为你介绍它们的作用和注意事项。break语句break语句用于在循环语句中提前结束循环,跳出循环体。它只能用于for循环、while循环和do-while循环中,不能单独使用。当break语句被执行......
  • 跳转语句:包括break、continue和goto语句的作用和注意事项。
    跳转语句是一种在程序中改变代码执行顺序的语句。常见的跳转语句包括break、continue和goto语句。本文将为你介绍它们的作用和注意事项。break语句break语句用于在循环语句中提前结束循环,跳出循环体。它只能用于for循环、while循环和do-while循环中,不能单独使用。当break语句被执行......
  • goto语句使用场景解读
    C语言中提供了goto语句和标记跳转的标号。从实践方面讲,goto语句意义不大,大多数情况即使没有goto语句也可以很容易的写出代码。但某些场合goto语句还是用得着的,最常见的用法就是终止程序中的某些深度嵌套的结构中的处理过程,例如一次跳出两层或多层循环。这种情况使用break是达不到目......
  • 无涯教程-PL/SQL - GOTO函数
    PL/SQL编程语言中的GOTO语句提供了从GOTO到同一子程序中带标签的语句的无条件跳转。注意-在任何编程语言中均不建议使用GOTO语句,因为它会使跟踪程序的控制流变得困难,从而使程序难以理解且难以修改。GOTO-语法PL/SQL中的GOTO语句的语法如下-GOTOlabel;....<<label>>......
  • bat批处理 call 和 goto 调用
    前言全局说明bat批处理call和goto调用一、bat批处理call和goto调用@echooffSETval="XXXXX"SETval=""SETval=%val:~1,-1%call:EmptyTest%val%goto:eof:EmptyTestif"%1"==""(echoEmpyt!!!)call:EmptyTest%val%......
  • go--for 循环、continue、break、goto
    for循环go里面的循环只有一个for循环for循环有下面四种方式的写法第一种方式,for后面什么都不写死循环,在代码中,如果一个for循环没有结束条件,则代码会陷入死循环packagemainimport("fmt""time")funcmain(){fmt.Println("开始")for{//死循......