嵌入式驅動學習第二周——斷言機制

前言

?? 這篇博客來聊一聊C/C++的斷言機制。

?? 嵌入式驅動學習專欄將詳細記錄博主學習驅動的詳細過程,未來預計四個月將高強度更新本專欄,喜歡的可以關注本博主并訂閱本專欄,一起討論一起學習。現在關注就是老粉啦!

目錄

  • 前言
  • 1. 斷言介紹
    • 1.1 斷言的概念
    • 1.2 斷言的實現
    • 1.3 禁用斷言
  • 2. 靜態斷言
    • 2.1 使用案例
    • 2.2 優點
  • 3. 運行時斷言
    • 3.1 assert使用
    • 3.2 assert注意事項
  • 參考資料

1. 斷言介紹

1.1 斷言的概念

?? 斷言就是用于在代碼中捕捉這些假設,可以將斷言看作是異常處理的一種高級形式。

?? 斷言表示為一些布爾表達式,程序員相信在程序中的某個特定點該表達式值為真。可以在任何時候啟用和禁用斷言驗證,因此可以在測試時啟用斷言,而在部署時禁用斷言。

?? 最終用戶在遇到問題時可以重新起用斷言。它可以快速發現并定位軟件問題,同時對系統錯誤進行自動報警。斷言可以對在系統中隱藏很深,用其它手段極難發現的問題可以用斷言來進行定位,從而縮短軟件問題定位時間,提高系統的可測性。

?? 斷言的本質就是if ... else ...判斷:

if (假設為true) {程序正常運行;
} else {報錯并終止程序
}

?? 那為什么還要斷言呢?如果全是if ... else... 的話就會有無數個if語句,甚至可能一個if語句的作用閾從文件頭到文件尾。并且使用斷言的時機,大部分都是偶然事件,只是要驗證的假設,僅僅想測試一下最壞的情況是否發生。

?? 除此以外,斷言的assert()宏只有Debug版本才有效,Release中則被忽略。

1.2 斷言的實現

?? 在使用斷言時,需要添加頭文件:#include <assert.h>

?? 斷言是assert(expression),這是一個!!!!

void assert( int expression );

?? assert計算表達式,如果值為假,那么先想stderr打印一條錯誤信息,然后調用abort來終止程序運行。

1.3 禁用斷言

?? 調試結束后,可以在#include語句之前插入#define NDEBUG來禁用assert調用:

#define NDEBUG 
#include <assert.h>

2. 靜態斷言

2.1 使用案例

?? 靜態斷言主要是用來約束程序在編譯時要滿足的一定要求,是在c++11中引入的。

?? 其定義如下所示:

static_assert(常量表達式,提示字符串);

?? 如果第一個參數常量表達式的值為真(true或者非零值),那么static_assert不做任何事情,就像它不存在一樣,否則會產生一條編譯錯誤,錯誤位置就是該static_assert語句所在行。錯誤提示就是第二個參數提示字符串

#include <assert.h>int main(void) {static_assert(false, "This is an error");return 0;
}

?? 在IDE中就會報錯提示。并且下面的錯誤提示就是后面自己寫的錯誤提示。

在這里插入圖片描述

在這里插入圖片描述

2.2 優點

1、使用static_assert,我們可以在編譯期間發現更多的錯誤,提前找出錯誤的原因。
??
2、static_assert可以用在全局作用域中,命名空間中,類作用域中,函數作用域中,幾乎可以不受限制的使用。
??
3、編譯器在遇到一個static_assert語句時,通常立刻將其第一個參數作為常量表達式進行演算,但如果該常量表達式依賴于某些模板參數,則延遲到模板實例化時再進行演算,這就讓檢查模板參數成為了可能。
??
4、由于之前有望加入C++0x標準的concepts提案最終被否決了,因此對于檢查模板參數是否符合期望的重任,就要靠static_assert來完成了,所以如何構造適當的常量表達式,將是一個值得探討的話題。
??
5、性能方面,由于是static_assert編譯期間斷言,不生成目標代碼,因此static_assert不會造成任何運行期性能損失

3. 運行時斷言

3.1 assert使用

?? 運行時斷言可以在程序運行過程中,判斷一些支持程序正常運行的假設性條件是否滿足。

?? 上面1.3中的assert宏就是動態斷言

3.2 assert注意事項

?? 可以在函數開始處檢驗傳入參數的合法性

int readNum(int n) {assert(n > 0);return 1;
}

?? 每個assert只檢驗一個條件,因為同時檢驗多個條件時,如果斷言失敗,無法直觀的判斷是哪個條件失敗

// 不要寫成這樣
assert(n > 0 && n < maxBound);
// 最好寫成這樣
assert(n > 0);
assert(n < maxBound);

?? 不能使用改變環境的語句,因為assert只在DEBUG個生效,如果這么做,會使用程序在真正運行時遇到問題

// 不要寫成這樣
assert(i++ > 10);      
// 最好寫成這樣
assert(i > 10);
i++;

?? assert和后面的語句應空一行,以形成邏輯和視覺上的一致感

?? 有的地方,assert不能代替條件過濾

參考資料

[1] C語言之斷言的一些理解

[2] c++11中靜態斷言static_assert

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/719751.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/719751.shtml
英文地址,請注明出處:http://en.pswp.cn/news/719751.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

貪心 Leetcode 134 加油站

加油站 Leetcode 134 學習記錄自代碼隨想錄 在一條環路上有 n 個加油站&#xff0c;其中第 i 個加油站有汽油 gas[i] 升 你有一輛油箱容量無限的的汽車&#xff0c;從第 i 個加油站開往第 i1 個加油站需要消耗汽油 cost[i] 升。你從其中的一個加油站出發&#xff0c;開始時油…

串聯所有單詞的子串

題目鏈接 串聯所有單詞的子串 題目描述 注意點 words[i] 和 s 由小寫英文字母組成1 < words.length < 5000可以以 任意順序 返回答案words中所有字符串長度相同 解答思路 根據滑動窗口哈希表解決本題&#xff0c;哈希表存儲words中所有的單詞及單詞的出現次數&#…

Reactor詳解

目錄 1、快速上手 介紹 2、響應式編程 2.1. 阻塞是對資源的浪費 2.2. 異步可以解決問題嗎&#xff1f; 2.3.1. 可編排性與可讀性 2.3.2. 就像裝配流水線 2.3.3. 操作符&#xff08;Operators&#xff09; 2.3.4. subscribe() 之前什么都不會發生 2.3.5. 背壓 2.3.6. …

p18 線性代數,行階梯型矩陣

行階梯型矩陣 行最簡型矩陣

steam游戲搬磚,跨國信息差項目,每天1小時收益也很不錯

大家好&#xff0c;我是阿陽&#xff01;每天都是一個新的開始&#xff01; 今天看到個Steam游戲搬磚項目&#xff0c;還是跨國國際貿易&#xff0c;感覺很好玩&#xff0c;特來給大家分享。 原理簡介 就是把Steam上的游戲裝備&#xff0c;搬運到國內網易Buff平臺上來賣。目前…

算法沉淀——動態規劃之01背包問題(leetcode真題剖析)

算法沉淀——動態規劃之01背包問題 01.【模板】01背包02.分割等和子集03.目標和04.最后一塊石頭的重量 II 01背包問題是一類經典的動態規劃問題&#xff0c;通常描述為&#xff1a;有一個固定容量的背包&#xff0c;以及一組物品&#xff0c;每件物品都有重量和價值&#xff0c…

c++基礎學習第二天(數組,函數)

提示&#xff1a;c基礎學習第二天&#xff08;數組&#xff0c;函數&#xff09; 文章目錄 1、數組1.1、 概述1.2、一維數組1.2.1、一維數組定義方式1.2.2、一維數組名稱的用途. 1.3、 二維數組1.3.1、二維數組定義方式1.3.2、二維數組數組名的用途 2、函數2.1、概述2.2、函數的…

云計算 2月28號 (linux的磁盤分區)

一 存儲管理 主要知識點: 基本分區、邏輯卷LVM、EXT3/4/XFS文件系統、RAID 初識硬盤 機械 HDD 固態 SSD SSD的優勢 SSD采用電子存儲介質進行數據存儲和讀取的一種技術&#xff0c;擁有極高的存儲性能&#xff0c;被認為是存儲技術發展的未來新星。 與傳統硬盤相比&#xff0c…

Vue 3 中的 Composition API 詳解

Vue.js&#xff0c;作為前端領域流行的框架之一&#xff0c;以其響應式數據綁定和組件化開發贏得了廣大開發者的喜愛。隨著前端技術的不斷發展和項目復雜度的增加&#xff0c;Vue 團隊推出了 Vue 3&#xff0c;并引入了 Composition API&#xff0c;以更好地滿足復雜應用的需求…

深度偽造,讓網絡釣魚更加難以辨別

網絡釣魚一直是安全領域的一個突出話題&#xff0c;盡管這類詐騙形式已經存在了幾十年&#xff0c;依舊是欺詐攻擊或滲透組織的最有效方法之一。詐騙分子基于社會工程原理&#xff0c;通過郵件、網站以及電話、短信和社交媒體&#xff0c;利用人性&#xff08;如沖動、不滿、好…

嵌入式驅動學習第二周——Linux內核打印

前言 這篇博客來聊一聊Linux內核打印。 嵌入式驅動學習專欄將詳細記錄博主學習驅動的詳細過程&#xff0c;未來預計四個月將高強度更新本專欄&#xff0c;喜歡的可以關注本博主并訂閱本專欄&#xff0c;一起討論一起學習。現在關注就是老粉啦&#xff01; 目錄 前言1. dmesg指令…

react diff

react diff算法為降低算法復雜度提出了三大策略&#xff1a; 1.只進行同級比較 2.節點類型比較&#xff0c;不同元素生成不同的fiber樹 3.key作為元素的唯一標識 diff算法流程 diff算法需要進行兩輪遍歷&#xff1a; 第一輪遍歷更新的節點。 第二輪遍歷沒更新的節點。 第一輪…

【LeetCode:225. 用隊列實現棧 + 棧 | 隊列】

&#x1f680; 算法題 &#x1f680; &#x1f332; 算法刷題專欄 | 面試必備算法 | 面試高頻算法 &#x1f340; &#x1f332; 越難的東西,越要努力堅持&#xff0c;因為它具有很高的價值&#xff0c;算法就是這樣? &#x1f332; 作者簡介&#xff1a;碩風和煒&#xff0c;…

水牛社軟件是真的嗎?

軟件是真的&#xff0c;不過畢竟是為了賺錢或者獲取資源而買的&#xff0c;所以大部分只關心能賺多少錢吧 說實話&#xff0c;我用了2年了&#xff0c;一些獨立的項目還有群&#xff0c;有一月掙幾千上萬的&#xff0c;有一月賺幾百的 軟件是一個集合體&#xff0c;不是像很多…

【leetcode刷題之路】面試經典150題(5)——二叉樹+二叉樹層次遍歷+二叉搜索樹

文章目錄 9 二叉樹9.1 【遞歸】二叉樹的最大深度9.2 【遞歸】相同的樹9.3 【遞歸】翻轉二叉樹9.4 【遞歸】對稱二叉樹9.5 【遞歸】從前序與中序遍歷序列構造二叉樹9.6 【遞歸】從中序與后序遍歷序列構造二叉樹9.7 【BFS】填充每個節點的下一個右側節點指針 II9.8 【遞歸】二叉樹…

代碼隨想錄第二十七天 455.分發餅干 376.擺動序列 53.最大子序和 122.買賣股票的最佳時機II

LeetCode 455 分發餅干 題目描述 假設你是一位很棒的家長&#xff0c;想要給你的孩子們一些小餅干。但是&#xff0c;每個孩子最多只能給一塊餅干。 對每個孩子 i&#xff0c;都有一個胃口值 g[i]&#xff0c;這是能讓孩子們滿足胃口的餅干的最小尺寸&#xff1b;并且每塊餅…

2024全國護網行動HW行動招聘/收人!!!

2024全國護網行動HW行動招聘 溯蓉信創開始收人啦&#xff01;&#xff01;&#xff01;現在開始收錄2024HW簡歷&#xff0c;感興趣的小伙伴掃碼二維碼添加微信 我們簽約后&#xff0c;入場即預付款3k&#xff0c;簽約后我們會在HW之前對我們的人員進行HW培訓&#xff0c;保證上…

Three.js--》探尋Cannon.js構建震撼的3D物理交互體驗(一)

我們用three.js可以繪制出各種酷炫的畫面&#xff0c;但是當我們想要一個更加真實的物理效果的話&#xff0c;這個時候我們就需要一個物理的庫&#xff0c;接下來我們就講解一下今天要學習的canon&#xff0c;它可以給我們提供一個更加真實的物理效果&#xff0c;像物體的張力、…

YOLOv8姿態估計實戰:訓練自己的數據集

課程鏈接&#xff1a;https://edu.csdn.net/course/detail/39355 YOLOv8 基于先前 YOLO 版本的成功&#xff0c;引入了新功能和改進&#xff0c;進一步提升性能和靈活性。YOLOv8 同時支持目標檢測和姿態估計任務。 本課程以熊貓姿態估計為例&#xff0c;將手把手地教大家使用C…

Mysql實戰(2)之MySQL執行流程

-- 查看mysql當前有多少連接 show global status like Thread%; /* Threads_cached&#xff1a;緩存中的線程連接數 Threads_connected&#xff1a;當前打開的連接數 Threads_created&#xff1a;為處理連接創建的線程數 Threads_running&#xff1a;非睡眠狀態的連接數&…