最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++之a(chǎn)ssert推薦用法及注意事項

 更新時間:2024年07月10日 09:16:08   作者:流星雨愛編程  
這篇文章主要給大家介紹了關于C++之a(chǎn)ssert推薦用法及注意事項的相關資料,assert 是一個預處理宏,用于在運行時檢查表達式是否為真,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

1.引言

assert在 <assert.h> 頭文件中定義,其作用是如果它的提交呢返回錯誤,則終止執(zhí)行。

原型定義:

    #include <assert.h>
    void assert(int expression);

assert的作用是先計算表達式expression,如果其值為假(即為0),那么它向stderr打印一條錯誤信息,然后通過調(diào)傭abort來終止程序運行。

通常,它用于檢查在程序執(zhí)行過程中應始終為真的條件。即當違反真理時, 觸發(fā)斷言. 比如1+1=2,當1+1≠2時觸發(fā)斷言。比如,

    assert(false); // 中斷程序;
    assert(0 && "the code is error!"); // 中斷并打印信息

2.簡單示例

#include <assert.h> // header

int divide(int numerator, int denominator) {
    assert(denominator != 0); // 確保分母不為零
    return numerator / denominator;
}

int main() {
    int result = divide(10, 2);
    // ...
    return 0;
}

在上面的示例中,assert 宏確保分母永遠不為零。如果分母為零,程序?qū)⒁灾甘疚募?、行號和失敗的表達式的錯誤消息終止。

3.推薦使用方法

經(jīng)常在C++程序中,以便于在開發(fā)過程中進行斷言檢查,而在發(fā)布版本中則禁用這些檢查。

推薦寫成如下方式,編寫一個assert_utils.h文件,內(nèi)容如下:

#pragma once

#ifndef RELEASE
#include <cassert>
#define ASSERT(f) assert(f) 
#else
#define ASSERT(f) ((void)0)
#endif

下面是對這段代碼的解釋:

1) #pragma once:這是一個預處理指令,用于確保頭文件只被包含一次。它的效果取決于編譯器,但大多數(shù)現(xiàn)代編譯器都支持它。

2) #ifndef RELEASE:這是一個預處理指令,用于檢查是否定義了RELEASE宏。如果沒有定義,編譯器將繼續(xù)執(zhí)行下面的代碼塊。

3) #include <cassert>:如果RELEASE宏沒有定義,編譯器將包含cassert頭文件,這是標準C++庫的一部分,提供了assert宏。

4) #define ASSERT(f) assert(f):定義了一個宏ASSERT,它接受一個表達式f作為參數(shù)。當ASSERT被調(diào)用時,它將執(zhí)行assert(f),如果f為假(即表達式結(jié)果為0),程序?qū)⒔K止運行,并顯示一個斷言失敗的消息。

5) #else:如果RELEASE宏被定義,編譯器將跳過上面的代碼塊,執(zhí)行下面的代碼。

6) #define ASSERT(f) ((void)0):在發(fā)布版本中,ASSERT宏被定義為一個空操作,即什么都不做。這樣,在發(fā)布版本的程序中,所有ASSERT調(diào)用都不會執(zhí)行任何操作,從而避免了性能損耗和潛在的程序中斷。

7) #endif:結(jié)束#ifndef RELEASE條件編譯塊。

4.常見使用場景和注意事項

4.1.檢查參數(shù)的合法性

示例如下:

int  sendData(const char* pData, int len)
{
    //[1] 校驗參數(shù)的合法性
    assert(pData);
    assert(len > 0)

    //[2]
    //...
}

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

assert(pData && len > 0);  //這樣不好

4.2.assert不能使用改變環(huán)境的語句

因為assert只在DEBUG環(huán)境中生效,如果這么做,會導致DEBUG和RELEASE的邏輯不一致。如:

assert(i++ < 100);

在DEUG環(huán)境下,每次都會執(zhí)行i++,而在RELEASE環(huán)境中不會執(zhí)行i++,這樣就會導致兩種環(huán)境下的執(zhí)行結(jié)果不一樣,正確的寫法是:

assert(i < 100);
i++;

4.3.在未知的邏輯中添加assert(false)

如:

//根據(jù)業(yè)務類型處理業(yè)務
void  dealPro(int type)
{
    if (type == 0){
        // 文本業(yè)務
    }else if (type == 1){
        // 地圖業(yè)務
    }else if (type == 2){
        // 測試業(yè)務
    }else{
        assert(false);
    }
}

上述代碼,我們的業(yè)務邏輯只涉及到文本、地圖、測試業(yè)務,其它的都是非法業(yè)務,添加assert(false),一旦type不等與1、2、3,就會出現(xiàn)斷言錯誤,查看程序堆棧,這樣就非??焖俚亩ㄎ怀绦蚴悄膫€地方出現(xiàn)邏輯錯誤了,這個也是一個非常好的調(diào)試技巧。

5.總結(jié)

總之,assert是一種在開發(fā)過程中快速檢測程序錯誤的有效工具,但在發(fā)布的產(chǎn)品代碼中通常被禁用以避免性能影響。開發(fā)者可以根據(jù)需要使用assert或其他錯誤處理機制來確保程序的正確性和健壯性。

到此這篇關于C++之a(chǎn)ssert推薦用法及注意事項的文章就介紹到這了,更多相關C++ assert用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • OpenCV c++滑動條的創(chuàng)建和使用代碼

    OpenCV c++滑動條的創(chuàng)建和使用代碼

    滾動條(Trackbar)在OpenCV中是非常方便的交互工具,它依附于特定的窗口而存在,下面這篇文章主要給大家介紹了關于OpenCV?c++滑動條的創(chuàng)建和使用的相關資料,需要的朋友可以參考下
    2023-06-06
  • C語言實現(xiàn)頁面置換算法

    C語言實現(xiàn)頁面置換算法

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)頁面置換算法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C++11包裝器function和bind示例詳解

    C++11包裝器function和bind示例詳解

    本文介紹了C++中的std::function和bind函數(shù),std::function可以將不同類型的函數(shù)用相同的類型表示,實現(xiàn)多態(tài),bind函數(shù)可以對接收的fn可調(diào)用對象處理后返回一個可調(diào)用對象,用于調(diào)整參數(shù)的順序和數(shù)量,感興趣的朋友跟隨小編一起看看吧
    2026-05-05
  • C語言實現(xiàn)簡單的飛機大戰(zhàn)游戲

    C語言實現(xiàn)簡單的飛機大戰(zhàn)游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單的飛機大戰(zhàn)游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C語言代碼實現(xiàn)簡單三子棋游戲

    C語言代碼實現(xiàn)簡單三子棋游戲

    這篇文章主要為大家詳細介紹了C語言代碼實現(xiàn)簡單三子棋游戲,文中安裝步驟介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Qt實現(xiàn)電子時鐘的示例代碼

    Qt實現(xiàn)電子時鐘的示例代碼

    這篇文章主要為大家詳細介紹了如何利用Qt實現(xiàn)顯示與桌面上并可以隨意拖拽至桌面任意位置的電子時鐘案例,感興趣的小伙伴可以嘗試一下
    2022-06-06
  • C/C++實現(xiàn)詞法分析程序的示例代碼

    C/C++實現(xiàn)詞法分析程序的示例代碼

    這篇文章主要為大家詳細介紹了如何基于C/C++實現(xiàn)一個簡單的詞法分析程序,并通過完成詞法分析程序,了解詞法分析的過程,感興趣的小伙伴可以跟隨小編一起學習學習
    2023-05-05
  • c++ 端口掃描程序?qū)崿F(xiàn)案例

    c++ 端口掃描程序?qū)崿F(xiàn)案例

    下面小編就為大家?guī)硪黄猚++ 端口掃描程序?qū)崿F(xiàn)案例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • 數(shù)據(jù)結(jié)構 數(shù)組順序存儲詳細介紹

    數(shù)據(jù)結(jié)構 數(shù)組順序存儲詳細介紹

    這篇文章主要介紹了數(shù)據(jù)結(jié)構 數(shù)組順序存儲詳細介紹的相關資料,需要的朋友可以參考下
    2017-05-05
  • C++關于Makefile的詳解含通用模板

    C++關于Makefile的詳解含通用模板

    今天小編就為大家分享一篇關于C++關于Makefile的詳解含通用模板,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12

最新評論

瓦房店市| 台北市| 赣州市| 临武县| 华坪县| 乐业县| 蕉岭县| 阳信县| 额尔古纳市| 浮梁县| 华宁县| 灌云县| 孝感市| 灯塔市| 泽库县| 乐业县| 汉中市| 蒙阴县| 德令哈市| 长顺县| 廊坊市| 兰溪市| 富川| 鄢陵县| 保亭| 读书| 南昌市| 荥阳市| 商水县| 泰州市| 广安市| 桐梓县| 博罗县| 枣庄市| 绥滨县| 泗水县| 营山县| 遵化市| 阿勒泰市| 高邑县| 宁津县|