C语言中如何实现同一项目中的快速跳转
goto语句与jmp语句
goto语句与jmp语句的相同点
两者都能够实现快速跳转,而事实上,尽管这种快速跳转极可能导致语句逻辑混乱,既不容易理解,也不方便调试、修改,但这只能看成是程序员自己的问题。语句本身没有错,至少它在实现快速跳转这一方面能够产生极大的作用。
然而,我们依然不建议使用这两种语句,一方面,由于它本身会使逻辑出现跳跃,不利于程序的结构化;另一方面,非常容易产生某些未知的错误。以此,我们建议不使用或少使用这两种语句。
goto语句与jmp语句的不同点(附使用方法)
goto语句只能够实现同一函数下的跳转
无论是main函数也好,自定义函数也罢,goto语句不能够在不同的函数间跳转。但这并非限制在同一定义域内:
#include<stdio.h>
int main(){
aa:puts("asdf");
int i=0;
while(i>10){
puts("qwer");
goto aa;
i++;
}
}
这是在同一函数内不同定义域中的跳转
#include<stdio.h>
void asdf(){
puts("qwer");
goto aa;
}
int main(){
aa:puts("asdf");
asdf();
}
这是不同函数下的跳转,编译失败。
jmp语句能够实现不同函数间的跳转
jmp语句则没有goto的限制,能够实现不同函数间的跳转。
#include<stdio.h>
#include <setjmp.h> //需要的头文件
jmp_buf aa;
void asdf(){
puts("qwer");
longjmp(aa,1);
}
int main(){
setjmp(aa);
puts("asdf");
asdf();
}
当然,编译结果显然是一个死循环。
好吧,我还是给截出来吧。
而事实上,jmp语句还拥有更加强大的功能:能够实现同一项目中不同源文件间的跳转
但这里需要注意一点:不同源文件间的跳转需要在其他界面声明
否则无法识别:
而声明的方法与通常的全局变量声明并无太大差别:
extern aa;
void asdf(){
puts("qwer");
longjmp(aa,1);
}
编译成功:
除此之外(问题)
但我在写项目的时候出现了两个问题,暂时没有解决,同时也希望能够和看到我这篇文章的人一起讨论。
有关extern的使用
我在做自己的项目时,第一次使用了jmp语句,但在声明时发现
extern jmp_buf aa; //会报错
extern aa; //不会报错
为什么?
而同样令我疑惑的就是:
假如我定义了一个全局变量,我在不同源文件中使用extern声明
int n; //假设这个变量在main.c中被定义
extern int n; //不会报错
extern n; //也不会报错
为什么?
有关longjmp的使用
费话不多说,直接粘图片
这里的longjmp编译过去了。
而我在测试的时候发现:
在同一源文件下编译就过不去了。
那么理所当然的,我再度进行了测试:
建立一个项目,然后longjmp(aa)就能成功编译并运行。
为什么?
如果将项目中的改为longjmp(aa,1)依然能成功编译并运行。
为什么?
(附图):