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

本文探讨了C语言中goto和jmp语句的使用,包括它们在快速跳转上的相似性和不同点。goto仅限于在同一函数内的跳转,而jmp语句(通过longjmp)可以实现跨函数甚至跨源文件的跳转。然而,由于可能导致的逻辑混乱和调试困难,不推荐频繁使用这两种语句。文章中还提出了关于extern声明和longjmp使用时遇到的问题,引发对这两点的讨论。
摘要由CSDN通过智能技术生成

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)依然能成功编译并运行。
为什么?
(附图):
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

惊雲浅谈天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值