C++基礎系列【35】巧用assert

博主介紹:程序喵大人

  • 35- 資深C/C++/Rust/Android/iOS客戶端開發
  • 10年大廠工作經驗
  • 嵌入式/人工智能/自動駕駛/音視頻/游戲開發入門級選手
  • 《C++20高級編程》《C++23高級編程》等多本書籍著譯者
  • 更多原創精品文章,首發gzh,見文末
  • 👇👇記得訂閱專欄,以防走丟👇👇
    😉C++基礎系列專欄
    😃C語言基礎系列專欄
    🤣C++大佬養成攻略專欄
    🤓C++訓練營
    👉🏻個人網站

C/C++里,assert是一種比較常用的調試策略。

定義

assert字面意思是斷言,用于判斷是否滿足某個條件,如果不滿足某個條件,則程序會直接崩潰,控制臺上會顯示崩潰所在的文件名和行號。

看下它的使用:

#include <assert.h>
#include <stdio.h>void func(int a) {assert(a > 0);printf("%d", a);
}int main() { func(-1); }

示例中我用assert來表示函數func的輸入一定要>0

我如果輸入了-1,程序運行時會在assertcrash,同時提供了報錯的詳細:

a.out: test.cc:5: void func(int): Assertion `a > 0' failed.Aborted

注意事項:

我們一定在assert處只做判斷,不要添加任何功能邏輯,因為assert只在debug模式下有作用release模式下,assert這行代碼會自動跳過去,會自動被忽略。

assert(++i > 0);

這種改變了i狀態的assert代碼千萬不要寫,因為會導致debug模式和release模式下的行為不一致。

什么時候使用assert

期望某塊邏輯一定要滿足某個前置條件,如果不滿足就要crash,這方便于我們在debug模式下調試程序,如果crash,方便我們進一步修復問題,使其滿足assert條件。

比如我們要輸出某個字符串,做一次判空其實也是耗費性能的,我們期望傳進來的串一定非空,如果是空,那就直接crash

void func(const char* s) {printf("hello %s \n", s);
}

static_assert

上面的assert運行時斷言,C++11之后還有個編譯時斷言:static_assert,用于在編譯時判斷某些條件,如果斷言失敗,則會編譯失敗,用法和assert類似。

#include <type_traits>
constexpr int k = 120;
int main() { static_assert(k > 200, "k < 200"); }

輸出:

test.cc:8:14: error: static_assert failed due to requirement 'k > 200' "k < 200"int main() { static_assert(k > 200, "k < 200"); }
^             ~~~~~~~1 error generated

static_assert后面可以跟著一個字符串,在斷言失敗時,會在控制臺輸出此字符串,方便提示我們相關信息。

練習

  • static_assert還有很多作用,比如可以判斷某個類是否有默認構造函數,某個函數是否是noexcept等,可以自己嘗試一下。

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

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

相關文章

【EI檢索】2025年城市設計與規劃國際會議 (CoUDP 2025)

重要信息 會議網址&#xff1a;www.coudp.org 會議時間&#xff1a;2025年9月19-21日 召開地點&#xff1a;中國北京 截稿時間&#xff1a;2025年8月19日 錄用通知&#xff1a;投稿后2周內 收錄檢索&#xff1a;Ei Compendex, SCOPUS 會議簡介 2025年城市設計與規劃…

《實戰AI智能體》MCP對Agent有哪些好處

首先MCP為Agent提供了標準化的方式來接入各種工具和數據源,無論是本地運行的工具,例如通過stdio服務器,還是遠程托管的服務HTTP over SSE服務, Agent都可以通過統一的接口與它們進行交互,極大擴展了第三方工具庫。 例如,在金融領域,Agent 可以接入股票分析的MCP工具。當…

知識圖譜在官網中的本質與部署邏輯

知識圖譜在官網中的本質與部署邏輯 ?1. 知識圖譜不是獨立頁面&#xff0c;而是智能化基礎設施 知識圖譜的最終形態并非一個可見的“圖譜頁面”&#xff0c;而是滲透在官網各交互模塊的AI能力引擎&#xff0c;其核心作用在于&#xff1a; ?后臺&#xff1a;構建實體關系網絡…

藍橋杯沖刺

例題1&#xff1a;握手問題 方法1&#xff1a;數學推理(簡單粗暴&#xff09; 方法2&#xff1a;用代碼實現方法1 #include<iostream> using namespace std; int main() {int result 0;for (int i 1; i < 49; i){for (int j i 1; j < 50; j){//第i個人與第j個…

如何在服務器里備份文件或系統

當我們在企業里&#xff0c;備份文件或者系統是需要經常做的&#xff0c;當我們服務器系統崩潰了或者損壞了&#xff0c;或者我們的存放的工作需求的文件夾損壞丟失&#xff0c;這時候如何我們提前備份了就可以快速回復。 那接下來我們直接上實操&#xff0c;接下來操作是在虛…

Qt實現點擊按鈕彈出側邊框(可用于登錄界面)

Qt實現點擊按鈕彈出側邊框 1、創建界面2、封面按鈕實現2.1 連接信號與槽2.2固定封面按鈕、側邊框及各個標簽位置和頂層顯示封面按鈕2.3創建側邊框狀態并在初始化列表中初始化2.4 側邊框動畫效果實現 3、視頻演示效果4、總結 1、創建界面 封面按鈕樣式表 QPushButton { border…

SQL WHERE 與 HAVING

WHERE 和 HAVING 都是 SQL 中用于篩選數據的子句&#xff0c;但它們有重要的區別 WHERE 子句 在 分組前 過濾數據 作用于 原始數據行 不能使用聚合函數 執行效率通常比 HAVING 高 SELECT column1, column2 FROM table WHERE condition; HAVING 子句 在 分組后 過濾數據 …

表格數據導出為Excel

環境及插件配置&#xff1a;&#xff08;理論上vue2應該也可以使用&#xff0c;沒有試驗過&#xff09; "vue": "^3.2.36", "webpack": "^5.94.0", "webpack-cli": "^5.1.4", "file-saver": "^2.…

Photoshop 2025 Mac中文 Ps圖像編輯軟件

Photoshop 2025 Mac中文 Ps圖像編輯軟件 文章目錄 Photoshop 2025 Mac中文 Ps圖像編輯軟件一、介紹二、效果三、下載 一、介紹 Adobe Photoshop 2025 Mac版集成了多種強大的圖像編輯、處理和創作功能。①強化了Adobe Sensei AI的應用&#xff0c;通過智能摳圖、自動修復、圖像…

rust Send Sync 以及對象安全和對象不安全

開頭&#xff1a;菜鳥小明的疑惑 小明&#xff1a; “李哥&#xff0c;我最近學 Rust&#xff0c;感覺它超級嚴謹&#xff0c;啥 Send、Sync、對象安全、靜態分發、動態分發的&#xff0c;我都搞暈了&#xff01;為啥 Rust 要設計得這么復雜啊&#xff1f;” 小李&#xff0…

JAVA:利用 JSONPath 操作JSON數據的技術指南

1、簡述 JSONPath 是一種強大的工具&#xff0c;用于查詢和操作 JSON 數據。類似于 SQL 的語法&#xff0c;它為處理復雜的 JSON 數據結構提供了簡單且高效的解決方案。? 代碼樣例&#xff1a;https://gitee.com/lhdxhl/springboot-example.git 本文將介紹 JSONPath 的基本…

服務器磁盤卷組緩存cache設置介紹

工具1&#xff1a; storcli a. 確認軟件包是否安裝 [rootlocalhost ~]#rpm -qa | grep storcli storcli-1.21.06-1.noarch 備注&#xff1a;若檢索結果為空&#xff0c;需要安裝對應的軟件安裝包。安裝命令如下&#xff1a; #rpm -ivh storcli-xx-xx-1.noarch.rpm b. 查看邏輯…

java項目分享-分布式電商項目附軟件鏈接

今天來分享一下github上最熱門的開源電商項目安裝部署&#xff0c;star 12.2k&#xff0c;自行安裝部署歷時兩天&#xff0c;看了這篇文章快的話半天搞定&#xff01;該踩的坑都踩完了&#xff0c;軟件也打包好了就差喂嘴里。 項目簡介 mall-swarm是一套微服務商城系統&#xf…

QtWebApp使用

QtWebApp 是一個輕量級的 HTTP 服務器庫,基于 Qt 網絡模塊(QTcpServer 和 QTcpSocket)實現,適用于嵌入式設備、本地服務或需要快速搭建 Web 接口的 Qt 應用程序。 1. 核心功能 HTTP/1.1 服務器 支持 GET、POST、PUT、DELETE 等標準 HTTP 方法。 解析請求頭、查詢參數(Qu…

用Rust和WebAssembly打造輕量級前端加密工具

開頭聊兩句 最近在折騰前端項目時&#xff0c;發現一個問題&#xff1a;很多時候需要在瀏覽器里做點加密作&#xff0c;比如保護用戶輸入的數據&#xff0c;但JavaScript跑起來總感覺慢吞吞的。于是我開始琢磨&#xff0c;能不能用Rust寫個高性能的加密模塊&#xff0c;再通過W…

Linux NUC小主機化身視頻會議服務器: 技術優勢與部署實戰

在遠程辦公常態化背景下&#xff0c;視頻會議系統對硬件的輕量化、低功耗與穩定性提出了更高要求。基于Intel NUC&#xff08;Next Unit of Computing&#xff09;打造的Linux服務器方案&#xff0c;憑借其高性能、低能耗和可擴展性優勢&#xff0c;正成為中小企業搭建視頻會議…

idea查看class字節碼

概述 如何查看class字節碼&#xff1f;話不多說&#xff0c;直接看示例&#xff01; 方法一 選中class類&#xff0c;然后選擇 View -> Show Bytecode 方法二 安裝jclasslib插件 方法三 Settings -> Tools -> External Tools 添加一個tool //指定javap.exe路…

python使用cookie、session、selenium實現網站登錄(爬取信息)

一、使用cookie 這段代碼演示了如何使用Python的urllib和http.cookiejar模塊來實現網站的模擬登錄&#xff0c;并在登錄后訪問需要認證的頁面。 # 導入必要的庫 import requests from urllib import request, parse# 1. 導入http.cookiejar模塊中的CookieJar類&#xff0c;用…

機器人基礎知識-1

1.六軸機器人中的六軸是什么&#xff1f; 第一軸&#xff08;J1&#xff09;&#xff1a;底座旋轉 控制機器人整體繞垂直軸旋轉&#xff08;左右擺動&#xff09;&#xff0c;決定工作范圍的水平方向。 第二軸&#xff08;J2&#xff09;&#xff1a;下臂前后擺動 驅動機器人的…

將代理連接到 Elasticsearch 使用模型上下文協議

作者&#xff1a;來自 Elastic Jedr Blaszyk 及 Joe McElroy 讓我們使用 Model Context Protocol 服務器 與 你的 數據 在 Elasticsearch 中聊天。 如果與你的數據交互像與同事聊天一樣輕松&#xff0c;會怎樣&#xff1f;想象一下&#xff0c;你只需簡單地問&#xff1a;“顯…