在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

C語言中的longjump和setjump函數

Q4MP_gh_c472c21 ? 來源:CSDN博客最后一個bug ? 作者:CSDN博客最后一個 ? 2022-03-30 15:00 ? 次閱讀
相信大家看到這個標題,可能已經猜到本文要談的話題了。沒錯,今天給大家介紹一種比goto還要“任性”的跳轉方式,那就是C函數庫中的如下兩個函數:

	

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

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

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

1函數介紹

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

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

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

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

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

當直接調用setjump函數,則返回0;

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

2跟goto有啥區別?

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

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

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

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


	

1#include 2#include 3 4jmp_bufmark; 5intfperr; 6voidfpcheck(void); 7 8/********************************************* 9*Function:main 10*Description:主任務函數 11*Note:(公眾號:最后一個bug) 12*********************************************/ 13intmain(void) 14{ 15intjmpret; 16 17//記錄異常代碼與正常代碼分支位置 18jmpret=setjmp(mark); 19if(jmpret==0) 20{ 21//正常用戶程序運行 22 23} 24else 25{ 26//在正常用戶程序運行過程中發生異常 27fpcheck(); 28} 29} 30/********************************************* 31*Function:Errorhandler 32*Description:異常中斷,在正常用戶程序運行過程中發生異常處理函數 33*Note:(公眾號:最后一個bug) 34*********************************************/ 35voidErrorhandler(void) 36{ 37fperr=num; 38longjmp(mark,-1);//進行長跳轉到異常處理 39} 40 41/********************************************* 42*Function:fpcheck 43*Description:故障處理函數 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局限性

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

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

最后

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

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

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

審核編輯:湯梓紅


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

    關注

    31

    文章

    5359

    瀏覽量

    120778
  • C語言
    +關注

    關注

    180

    文章

    7610

    瀏覽量

    137232
  • 函數
    +關注

    關注

    3

    文章

    4341

    瀏覽量

    62796
  • 跳轉
    +關注

    關注

    0

    文章

    5

    瀏覽量

    5983

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

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

收藏 人收藏

    評論

    相關推薦

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

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

    C語言中函數的基本知識

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

    C語言中宏定義的應用

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

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

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

    c語言函數指針定義,指針函數函數指針的區別

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

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

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

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

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

    C語言怎么跳出while函數

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

    C語言中函數的創建以及使用

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

    scanf在C語言中的作用

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

    c語言gets函數可以輸入數字嗎

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

    c語言中函數函數體用什么符號括起來

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

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

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

    C語言中的socket編程基礎

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

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

    電子發燒友網站提供《EE-128:C語言中的DSP:從C調用匯編類成員函數.pdf》資料免費下載
    發表于 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'>函數</b>
    主站蜘蛛池模板: 77788色淫网站免费观看| 5060午夜一级| 免费国产午夜在线观看| 国产色婷婷精品综合在线观看| 尻老逼| 狠狠色狠狠色综合日日不卡| 簧片地址| a在线观看网站| 国产资源免费观看| 欧美一级免费片| 天天摸天天添人人澡| 天堂网在线资源www最新版| 色综合久久久久久久久五月性色| 日韩在线视频www色| 性夜黄 a 爽免费看| 男人的午夜| 亚洲人毛茸茸bbxx| 三级视频在线| 狠狠要| 五月婷婷网址| 国产牛仔裤系列在线观看| 国产女人小便视频| 中文在线天堂网| 色婷婷精品综合久久狠狠| 免费激情网站| 美女视频黄.免费网址| 国产免费人成在线看视频| 国产在线播| 悠悠影院欧美日韩国产| 欧美黑人换爱交换乱理伦片| 天天射天天干| 亚洲禁片| 成人理伦| 高清一区二区| 日本精品一卡二卡≡卡四卡| 国产一区二区三区免费大片天美| a级黄色毛片三个搞一| 精品精品国产高清a毛片牛牛 | 在线电影你懂得| 亚洲三级电影| 明日花绮罗snis-862在线播放|