C语言中如何实现同一项目中的快速跳转——goto语句与jmp语句的使用

C语言中如何实现同一项目中的快速跳转

  • goto语句与jmp语句
    • goto语句与jmp语句的相同点
    • goto语句与jmp语句的不同点(附使用方法)
      • goto语句只能够实现同一函数下的跳转
      • jmp语句能够实现不同函数间的跳转
      • 而事实上,jmp语句还拥有更加强大的功能:能够实现同一项目中不同源文件间的跳转
  • 除此之外(问题)
    • 有关extern的使用
    • 有关longjmp的使用

goto语句与jmp语句

goto语句与jmp语句的相同点

两者都能够实现快速跳转,而事实上,尽管这种快速跳转极可能导致语句逻辑混乱,既不容易理解,也不方便调试、修改,但这只能看成是程序员自己的问题。语句本身没有错,至少它在实现快速跳转这一方面能够产生极大的作用。
然而,我们依然不建议使用这两种语句,一方面,由于它本身会使逻辑出现跳跃,不利于程序的结构化;另一方面,非常容易产生某些未知的错误。以此,我们建议不使用或少使用这两种语句。

goto语句与jmp语句的不同点(附使用方法)

goto语句只能够实现同一函数下的跳转

无论是main函数也好,自定义函数也罢,goto语句不能够在不同的函数间跳转。但这并非限制在同一定义域内:

#include
int main(){
	aa:puts("asdf");
	int i=0;
	while(i>10){
		puts("qwer");
	    goto aa;
	    i++;
	}
}

C语言中如何实现同一项目中的快速跳转——goto语句与jmp语句的使用_第1张图片
这是在同一函数内不同定义域中的跳转

#include
void asdf(){
	puts("qwer");
	goto aa;
}
int main(){
	aa:puts("asdf");
	asdf();
}

C语言中如何实现同一项目中的快速跳转——goto语句与jmp语句的使用_第2张图片
这是相应的错误提示
这是不同函数下的跳转,编译失败。

jmp语句能够实现不同函数间的跳转

jmp语句则没有goto的限制,能够实现不同函数间的跳转。

#include
#include   //需要的头文件
jmp_buf aa;
void asdf(){
	puts("qwer");
	longjmp(aa,1);
}
int main(){
	setjmp(aa);
	puts("asdf");
	asdf();
}

当然,编译结果显然是一个死循环。
好吧,我还是给截出来吧。
C语言中如何实现同一项目中的快速跳转——goto语句与jmp语句的使用_第3张图片

而事实上,jmp语句还拥有更加强大的功能:能够实现同一项目中不同源文件间的跳转

但这里需要注意一点:不同源文件间的跳转需要在其他界面声明
否则无法识别:
C语言中如何实现同一项目中的快速跳转——goto语句与jmp语句的使用_第4张图片

而声明的方法与通常的全局变量声明并无太大差别:

extern aa;
void asdf(){
	puts("qwer");
	longjmp(aa,1);
}

编译成功:
C语言中如何实现同一项目中的快速跳转——goto语句与jmp语句的使用_第5张图片

除此之外(问题)

但我在写项目的时候出现了两个问题,暂时没有解决,同时也希望能够和看到我这篇文章的人一起讨论。

有关extern的使用

我在做自己的项目时,第一次使用了jmp语句,但在声明时发现

extern jmp_buf aa;    //会报错
extern aa;    //不会报错

为什么?
而同样令我疑惑的就是:
假如我定义了一个全局变量,我在不同源文件中使用extern声明

int n;   //假设这个变量在main.c中被定义
extern int n;   //不会报错
extern n;   //也不会报错

为什么?

有关longjmp的使用

费话不多说,直接粘图片
C语言中如何实现同一项目中的快速跳转——goto语句与jmp语句的使用_第6张图片
这里的longjmp编译过去了。

而我在测试的时候发现:
C语言中如何实现同一项目中的快速跳转——goto语句与jmp语句的使用_第7张图片
在同一源文件下编译就过不去了。

那么理所当然的,我再度进行了测试:
C语言中如何实现同一项目中的快速跳转——goto语句与jmp语句的使用_第8张图片
建立一个项目,然后longjmp(aa)就能成功编译并运行。
为什么?

如果将项目中的改为longjmp(aa,1)依然能成功编译并运行。
为什么?
(附图):
C语言中如何实现同一项目中的快速跳转——goto语句与jmp语句的使用_第9张图片

你可能感兴趣的:(c语言,bug)