我不是C方面的专家,但我做得很好,我的主要工作是嵌入式系统和微控制器编程。
我知道避免使用GOTO指令是一个神话,因为它会创建意大利面条代码。作为一个微控制器程序员,我经常在小程序中使用汇编语言,而GOTO是唯一的选择,但是就像在C语言中一样(或与之不同?),在使用指令时必须要小心,因为如果您使用的是子例程,例如,您可能已经在堆栈存储器中使用了一个空间,因此可以返回到原始例程。
但是,如果您错误地使用GOTO指令从Soubroutine跳转到了主代码,则您没有释放堆栈内存,并且如果您多次调用该子例程,最终将导致溢出。
所以,我的问题是,当我们用C编写一个嵌套循环时,例如一堆FOR,然后使用goto指令从内部循环中中断,是否会引起与我之前描述的相同的问题?
goto
不能在功能之间跳转,只能在同一功能内跳转。因此它不会添加到堆栈中,也不会丢失堆栈帧。
setjmp()
和longjmp()
是一种更受约束的机制,它可以直接跳转到另一个功能。但是longjmp()
仅可在调用具有相同setjmp()
的jmp_buf
的函数的生命周期内使用,并且已指定将其展开到该函数的栈(语言规范实际上并不涉及栈,而是使用更通用的语言,但是在大多数实际实现中,它的作用相同。