两者都能够实现快速跳转,而事实上,尽管这种快速跳转极可能导致语句逻辑混乱,既不容易理解,也不方便调试、修改,但这只能看成是程序员自己的问题。语句本身没有错,至少它在实现快速跳转这一方面能够产生极大的作用。
然而,我们依然不建议使用这两种语句,一方面,由于它本身会使逻辑出现跳跃,不利于程序的结构化;另一方面,非常容易产生某些未知的错误。以此,我们建议不使用或少使用这两种语句。
无论是main函数也好,自定义函数也罢,goto语句不能够在不同的函数间跳转。但这并非限制在同一定义域内:
#include
int main(){
aa:puts("asdf");
int i=0;
while(i>10){
puts("qwer");
goto aa;
i++;
}
}
#include
void asdf(){
puts("qwer");
goto aa;
}
int main(){
aa:puts("asdf");
asdf();
}
jmp语句则没有goto的限制,能够实现不同函数间的跳转。
#include
#include //需要的头文件
jmp_buf aa;
void asdf(){
puts("qwer");
longjmp(aa,1);
}
int main(){
setjmp(aa);
puts("asdf");
asdf();
}
但这里需要注意一点:不同源文件间的跳转需要在其他界面声明
否则无法识别:
而声明的方法与通常的全局变量声明并无太大差别:
extern aa;
void asdf(){
puts("qwer");
longjmp(aa,1);
}
但我在写项目的时候出现了两个问题,暂时没有解决,同时也希望能够和看到我这篇文章的人一起讨论。
我在做自己的项目时,第一次使用了jmp语句,但在声明时发现
extern jmp_buf aa; //会报错
extern aa; //不会报错
为什么?
而同样令我疑惑的就是:
假如我定义了一个全局变量,我在不同源文件中使用extern声明
int n; //假设这个变量在main.c中被定义
extern int n; //不会报错
extern n; //也不会报错
为什么?