日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C語言中的longjump和setjump函數(shù)

Q4MP_gh_c472c21 ? 來源:CSDN博客最后一個bug ? 作者:CSDN博客最后一個 ? 2022-03-30 15:00 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

相信大家看到這個標題,可能已經猜到本文要談的話題了。沒錯,今天給大家介紹一種比goto還要“任性”的跳轉方式,那就是C函數(shù)庫中的如下兩個函數(shù):

	

1//所需頭文件 2#include 3 4intsetjump(jmp_bufbuf) 5voidlongjump(jmp_bufbuf,inti) 6

一些朋友該說了,“我從來不用這些跳轉,免得出問題”。還是一直以來的那句話,“存在即合理”~

下面,我們來看看這兩個函數(shù)到底有什么可以推敲的東西。

1函數(shù)介紹

有研究過RTOS的朋友應該對此不難理解,setjump主要是保存當前函數(shù)調用點的現(xiàn)場環(huán)境(或者叫上下文),比如各種寄存器、堆棧等等,那么這些環(huán)境信息就記錄在jmp_buf所定義的buf中。

而當我們在其他位置調用longjump函數(shù)就相當于一個長跳轉,傳入之前保存在buf中的信息,即可跳回到之前setjump所調用的位置(理解為恢復setjump所保存的環(huán)境也是可以的)。

所以,這里值得注意的是,不要率先調用longjump,否則程序不知道飛去哪里了。

其實跟RTOS中進行任務切換有著異曲同工之妙。

你大概已經注意到setjump有一個返回值,其主要分為兩種情況:

當直接調用setjump函數(shù),則返回0;

當調用longjump跳轉到setjump位置,則其返回longjump的第二個非零參數(shù)。

2跟goto有啥區(qū)別?

以前我也跟大家介紹過goto這匹野馬被馴服的方式(goto關鍵字你不知道的"那些事"(C語言提升)),在C語言中goto只能實現(xiàn)函數(shù)內部的跳轉,無法實現(xiàn)跨函數(shù)的直接跳轉,比如函數(shù)嵌套多層的跳轉等等。

當然,你也可以借助goto與函數(shù)返回配合完成函數(shù)之間的跳轉,不過那太麻煩了,所以這兩個庫函數(shù)該派上用場了。

這樣的跳轉太過于霸道,我們還是限制一下,切不可濫用,但其為異常處理代碼的模塊化帶來了福音,在非常多的開源庫中都有實際應用。

下面給大家一個參考示例 ::


	

1#include 2#include 3 4jmp_bufmark; 5intfperr; 6voidfpcheck(void); 7 8/********************************************* 9*Function:main 10*Description:主任務函數(shù) 11*Note:(公眾號:最后一個bug) 12*********************************************/ 13intmain(void) 14{ 15intjmpret; 16 17//記錄異常代碼與正常代碼分支位置 18jmpret=setjmp(mark); 19if(jmpret==0) 20{ 21//正常用戶程序運行 22 23} 24else 25{ 26//在正常用戶程序運行過程中發(fā)生異常 27fpcheck(); 28} 29} 30/********************************************* 31*Function:Errorhandler 32*Description:異常中斷,在正常用戶程序運行過程中發(fā)生異常處理函數(shù) 33*Note:(公眾號:最后一個bug) 34*********************************************/ 35voidErrorhandler(void) 36{ 37fperr=num; 38longjmp(mark,-1);//進行長跳轉到異常處理 39} 40 41/********************************************* 42*Function:fpcheck 43*Description:故障處理函數(shù) 44*Note:(公眾號:最后一個bug) 45*********************************************/ 46voidfpcheck(void) 47{ 48 49switch(fperr) 50{ 51caseINVALID: 52//userCode 53break; 54 55caseOVERFLOW: 56//userCode 57break; 58 59caseZERODIVIDE: 60//userCode 61break; 62default: 63break; 64} 65 66}

3局限性

這組函數(shù)除了前面介紹的注意事項,還有一個非常值得注意的點就是longjump的調用時機必須在setjump被調用的所在函數(shù)返回前。

因為setjump保存有堆棧信息等,一旦setjump的被調用的函數(shù)返回則相應的環(huán)境會被釋放,導致longjump無法在恢復到setjump調用位置,可能造成程序奔潰。

最后

好了,今天就跟大家分享這么多了,這一塊還有一些東西可以挖掘,后面再整理一下分享出來。如果你覺得有所收獲,一定記得點個贊!

原文標題:C語言中比goto還“霸道”的跳轉方式

文章出處:【微信公眾號:嵌入式ARM】歡迎添加關注!文章轉載請注明出處。

審核編輯:湯梓紅


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5622

    瀏覽量

    130489
  • C語言
    +關注

    關注

    183

    文章

    7648

    瀏覽量

    146251
  • 函數(shù)
    +關注

    關注

    3

    文章

    4423

    瀏覽量

    67909
  • 跳轉
    +關注

    關注

    0

    文章

    5

    瀏覽量

    6059

原文標題:C語言中比goto還“霸道”的跳轉方式

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    C語言中指針函數(shù)函數(shù)指針的概念及應用示例

    C語言中,指針函數(shù)函數(shù)指針是強大且常用的工具。它們允許我們以更靈活的方式處理函數(shù)和數(shù)據(jù),進而擴展程序的功能。
    發(fā)表于 08-16 16:14 ?2112次閱讀

    C語言中函數(shù)的基本知識

    函數(shù)C語言中的基本構建塊之一,它允許我們將代碼組織成可重用、模塊化的單元。
    發(fā)表于 08-16 18:25 ?1103次閱讀

    C語言中宏定義的應用

    C語言中,宏定義是一種預處理指令,用于在代碼中定義和使用常量、函數(shù)或代碼片段的替代。
    發(fā)表于 08-17 15:33 ?1616次閱讀

    C語言中atoi()函數(shù)應該怎么用?

    C語言中atoi()函數(shù)應該怎么用?
    發(fā)表于 10-14 09:10

    c語言函數(shù)指針定義,指針函數(shù)函數(shù)指針的區(qū)別

     往往,我們一提到指針函數(shù)函數(shù)指針的時候,就有很多人弄不懂。下面就由小編詳細為大家介紹C語言中函數(shù)指針,指針
    發(fā)表于 11-16 15:18 ?4316次閱讀

    單片機C語言中如何使用nop函數(shù)進行短延時的效果資料和程序說明

    單片機C語言中如何使用nop函數(shù)進行短延時的效果資料和程序說明 標準的C語言中沒有空語句。但在單片機的
    發(fā)表于 03-05 11:01 ?10次下載
    單片機<b class='flag-5'>C</b><b class='flag-5'>語言中</b>如何使用nop<b class='flag-5'>函數(shù)</b>進行短延時的效果資料和程序說明

    剖析什么是C語言中的隱式函數(shù)聲明

    「1、什么是C語言的隱式函數(shù)聲明」 在C語言中,函數(shù)在調用前不一定非要聲明。如果沒有聲明,那么編
    的頭像 發(fā)表于 05-25 09:38 ?4944次閱讀
    剖析什么是<b class='flag-5'>C</b><b class='flag-5'>語言中</b>的隱式<b class='flag-5'>函數(shù)</b>聲明

    C語言怎么跳出while函數(shù)

    C語言中while函數(shù)是經常用到的,這里說一下可以跳出while函數(shù)的幾種方法。
    的頭像 發(fā)表于 06-17 15:40 ?4w次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>怎么跳出while<b class='flag-5'>函數(shù)</b>

    C語言中函數(shù)的創(chuàng)建以及使用

    下面我們來介紹一下 C 語言中一個非常重要的概念 - 函數(shù) (function)。首先就要先給函數(shù)下一個定義,函數(shù)就是完成特定任務的獨立代碼
    的頭像 發(fā)表于 07-06 09:38 ?7226次閱讀

    scanf在C語言中的作用

    scanf在C語言中的作用? scanf是C語言中的輸入函數(shù),用于從標準輸入設備(如鍵盤)讀取數(shù)據(jù),并將其存儲到變量中。它是
    的頭像 發(fā)表于 11-23 14:13 ?3292次閱讀

    c語言gets函數(shù)可以輸入數(shù)字嗎

    C語言中的gets函數(shù)是用來讀取字符串的,而不是用來讀取數(shù)字的。它會讀取輸入的字符直到遇到換行符或者文件結束符。因此,如果你嘗試使用gets函數(shù)來讀取數(shù)字,是無法準確獲取數(shù)字本身的。
    的頭像 發(fā)表于 11-24 10:00 ?2738次閱讀

    c語言中函數(shù)函數(shù)體用什么符號括起來

    知道函數(shù)是數(shù)學里的重要組成部分,數(shù)學中我們常見到函數(shù)的概念,但是你了解C語言中函數(shù)嗎?其實函數(shù)
    的頭像 發(fā)表于 11-24 15:52 ?1641次閱讀
    <b class='flag-5'>c</b><b class='flag-5'>語言中</b><b class='flag-5'>函數(shù)</b>的<b class='flag-5'>函數(shù)</b>體用什么符號括起來

    如何給C語言中函數(shù)定義兩個不同的名字?

    最近有位哥問我,如何給C語言中函數(shù)定義兩個不同的名字?就是這兩個名字都是指向同一個函數(shù),同一個地址,而且兩個名字都可以當做函數(shù)來用的那種。
    的頭像 發(fā)表于 12-19 16:21 ?1684次閱讀

    C語言中的socket編程基礎

    數(shù)據(jù) 步驟6:關閉socket 創(chuàng)建socket 在C語言中,創(chuàng)建socket需要使用socket()函數(shù)。這個函數(shù)需要兩個參數(shù):域
    的頭像 發(fā)表于 11-01 16:51 ?2350次閱讀

    EE-128:C語言中的DSP:從C調用匯編類成員函數(shù)

    電子發(fā)燒友網站提供《EE-128:C語言中的DSP:從C調用匯編類成員函數(shù).pdf》資料免費下載
    發(fā)表于 01-07 13:48 ?0次下載
    EE-128:<b class='flag-5'>C</b><b class='flag-5'>語言中</b>的DSP:從<b class='flag-5'>C</b>調用匯編類成員<b class='flag-5'>函數(shù)</b>
    铜山县| 新和县| 广东省| 财经| 平顶山市| 皋兰县| 陆良县| 永顺县| 蓬莱市| 延吉市| 淳安县| 大丰市| 景泰县| 基隆市| 枣庄市| 泰和县| 资兴市| 镇安县| 冷水江市| 石城县| 柘城县| 昌吉市| 光泽县| 安徽省| 丰都县| 托克逊县| 苗栗市| 梁平县| 舒兰市| 翁源县| 丹寨县| 阿瓦提县| 建湖县| 顺昌县| 山东省| 常山县| 双柏县| 柘城县| 乐都县| 安吉县| 天门市|