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

C++可變參數(shù)函數(shù)的實現(xiàn)方法示例

 更新時間:2020年12月06日 12:03:27   作者:apollo008  
這篇文章主要給大家介紹了關(guān)于C++可變參數(shù)函數(shù)的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

C++編程中實現(xiàn)可變參數(shù)函數(shù)有多種途徑,本文介紹一種最常見的實現(xiàn)途徑,即可變參數(shù)宏方法:形參生命為省略符,函數(shù)實現(xiàn)時用參數(shù)列表宏訪問參數(shù)。

1. 可變參數(shù)宏實現(xiàn)變參函數(shù)

可變參數(shù)宏實現(xiàn)可分為以下幾個步驟:

  1. 函數(shù)形參原型中給出省略符;
  2. 函數(shù)實現(xiàn)中聲明一個va_list可變參數(shù)列表變量;
  3. 開始初始化構(gòu)造va_list變量;
  4. 訪問變參列表;
  5. 完成清理工作;

上述步驟的實現(xiàn)需要使用到四個宏:

  1. va_list
  2. void va_start(va_list ap, last_arg)
  3. type va_arg (va_list ap, type)
  4. void va_end(va_list ap)

va_list 是在C語言中解決變參問題的一組宏

void va_start(va_list ap, last_arg)

ap :是一個 va_list 類型的對象,它用來存儲通過 va_arg 獲取額外參數(shù)時所必需的信息。

last_arg :是最后一個傳遞給函數(shù)的已知的固定參數(shù),即省略號之前的參數(shù)。

宏定義:type va_arg (va_list ap, type)

該宏用于變參數(shù)函數(shù)調(diào)用過程中,type是當(dāng)前參數(shù)類型,調(diào)用該宏后,ap指向變參數(shù)列表中的下一個參數(shù),返回ap指向的參數(shù)值,是一個類型為type的表達式。 ap是arg_ptr參數(shù)指針之意。

void va_end(va_list ap)

允許使用了 va_start 宏的帶有可變參數(shù)的函數(shù)返回。如果在從函數(shù)返回之前沒有調(diào)用 va_end,則結(jié)果為未定義。
這些宏在頭文件stdarg.h中聲明定義。因此使用時需要包含該頭文件。

下面給出用法示例:

#include <stdarg.h>

//可變參數(shù)函數(shù)sum(),求任意個數(shù)整數(shù)的和。

//Step1: 函數(shù)形參原型中給出省略符
int Sum(int count, ...);

int Sum(int count, ...) {
 //Step2: 函數(shù)實現(xiàn)中聲明一個va_list可變參數(shù)列表變量;
 va_list ap;
 //Step3: 開始初始化構(gòu)造va_list變量, 第二個參數(shù)為最后一個確定的形參
 va_start(ap, count);
 int sum = 0;
 for(int i = 0; i < count; i++) {
  //讀取可變參數(shù),的二個參數(shù)為可變參數(shù)的類型
  sum += va_arg(ap, int);
 }
 //清理工作
 va_end(ap);
 return sum;
}

實際中使用可變參數(shù)宏實現(xiàn)C++可變參數(shù)函數(shù)編程,還要注意一下幾點:

  • 函數(shù)原型中省略號必須在參數(shù)列表的末尾:也就是說,在函數(shù)原型中參數(shù)列表省略號的右邊不能再出現(xiàn)確定參數(shù);
  • 試用完成是用va_end做清理工作步驟不可缺少,否則可能導(dǎo)致內(nèi)存或資源泄漏;
  • va_list在一次訪問中不能后退,但可以多次構(gòu)造va_list多次訪問;

2. 更安全的可變參數(shù)函數(shù)實現(xiàn)方法

對于上面示例代碼中count傳進的實參如果與后面...省略符對應(yīng)的實際參數(shù)數(shù)量不一致時,可能導(dǎo)致函數(shù)風(fēng)險。這一切完全依賴運行時的具體情況而定,很不安全。

另一種更安全的可變參數(shù)宏實現(xiàn)方法是利用C++的 attribute ((format()))特性來輔助可變參數(shù)的檢查。

最常見的形式是有如下兩個:

__attribute__((format(printf, m, n))) 
__attribute__((format(scanf, m, n)))

其中參數(shù)m與n的含義為:

m:第幾個參數(shù)為格式化字符串(format string);

n:參數(shù)集合中的第一個,即參數(shù)“…”里的第一個參數(shù)在函數(shù)參數(shù)總數(shù)排在第幾;

attributeformat屬性可以給被聲明的函數(shù)加上類似printf或者scanf的特征,它可以使編譯器檢查函數(shù)聲明和函數(shù)實際調(diào)用參數(shù)之間的格式化字符串是否匹配。format屬性告訴編譯器,按照printf, scanf等標(biāo)準(zhǔn)C函數(shù)參數(shù)格式規(guī)則對該函數(shù)的參數(shù)進行檢查。這在我們自己封裝調(diào)試信息的接口時非常的有用。

format的語法格式為:

format (archetype, string-index, first-to-check)
  其中,“archetype”指定是哪種風(fēng)格;“string-index”指定傳入函數(shù)的第幾個參數(shù)是格式化字符串;“first-to-check”指定從函數(shù)的第幾個參數(shù)開始按上述規(guī)則進行檢查。

下面給出2個示例:

一般函數(shù):

為自己定義的一個帶有可變參數(shù)的函數(shù),其功能類似于printf:

extern void myprint(const char *format,...) attribute ((format(printf,1,2))); //m=1;n=2

extern void myprint(int l,const char *format,...) attribute ((format(printf,2,3))); //m=2;n=3

類成員函數(shù)

需要特別注意的是,如果myprint是一個函數(shù)的成員函數(shù),那么m和n的值可有點“懸乎”了,例如:

extern void myprint(int l,const char *format,...) attribute ((format(printf, 3,4 )));

其原因是,類成員函數(shù)的第一個參數(shù)實際上一個隱身的this指針。

到此這篇關(guān)于C++可變參數(shù)函數(shù)實現(xiàn)的文章就介紹到這了,更多相關(guān)C++可變參數(shù)函數(shù)實現(xiàn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c++ 解決無法打印uint8_t 類型變量的問題

    c++ 解決無法打印uint8_t 類型變量的問題

    這篇文章主要介紹了c++ 解決無法打印uint8_t 類型變量的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • C++實現(xiàn)LeetCode(205.同構(gòu)字符串)

    C++實現(xiàn)LeetCode(205.同構(gòu)字符串)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(205.同構(gòu)字符串),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C基礎(chǔ) 尋找隨機函數(shù)的G點詳解

    C基礎(chǔ) 尋找隨機函數(shù)的G點詳解

    下面小編就為大家?guī)硪黄狢基礎(chǔ) 尋找隨機函數(shù)的G點詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • 一篇文章帶你使用C語言編寫內(nèi)核

    一篇文章帶你使用C語言編寫內(nèi)核

    內(nèi)核是操作系統(tǒng)最核心的內(nèi)容,主要提供硬件抽象層、磁盤及文件系統(tǒng)控制、多任務(wù)等功能,由于其涉及非常廣泛的計算機知識,很少被人們所熟悉,因而披上了一層神秘的面紗
    2021-08-08
  • 總結(jié)C語言中const關(guān)鍵字的使用

    總結(jié)C語言中const關(guān)鍵字的使用

    一起雖然學(xué)過c語言,但是并沒有寫過太多的代碼,最近想要拾起c語言,就寫了一些代碼,但是對const關(guān)鍵字比較陌生,這里總結(jié)一下,方法自己和大家有需要的時候參考借鑒,下面跟著小編一起學(xué)習(xí)學(xué)習(xí)吧。
    2016-11-11
  • c語言函數(shù)如何求兩個數(shù)的最大值

    c語言函數(shù)如何求兩個數(shù)的最大值

    這篇文章主要介紹了c語言函數(shù)如何求兩個數(shù)的最大值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • C++實現(xiàn)LeetCode(168.求Excel表列名稱)

    C++實現(xiàn)LeetCode(168.求Excel表列名稱)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(168.求Excel表列名稱),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • VS Code C/C++環(huán)境配置教程(無法打開源文件“xxxxxx.h”或者檢測到 #include 錯誤,請更新includePath)(POSIX API)

    VS Code C/C++環(huán)境配置教程(無法打開源文件“xxxxxx.h”或者檢測到 #include 錯誤,請更新in

    這篇文章主要介紹了VS Code C/C++環(huán)境配置教程(無法打開源文件“xxxxxx.h” 或者 檢測到 #include 錯誤。請更新includePath) (POSIX API),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • C++容器map和pair對組實例詳解

    C++容器map和pair對組實例詳解

    pair?是一種模板類,允許將兩個不同類型的值組合在一起,它由兩個數(shù)據(jù)成員first和second組成,分別用來保存這兩個值,這篇文章主要介紹了C++容器——map和pair對組,需要的朋友可以參考下
    2024-05-05
  • C/C++數(shù)字與字符串互相轉(zhuǎn)換的實現(xiàn)示例

    C/C++數(shù)字與字符串互相轉(zhuǎn)換的實現(xiàn)示例

    本文主要介紹了C/C++數(shù)字與字符串互相轉(zhuǎn)換的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02

最新評論

盘山县| 突泉县| 娄烦县| 昌图县| 佳木斯市| 钟山县| 宜兰市| 苏州市| 武功县| 宜黄县| 清新县| 屯门区| 德阳市| 郴州市| 罗城| 阳春市| 雷山县| 治县。| 云阳县| 上林县| 平武县| 屏南县| 林口县| 吉木乃县| 屏边| 且末县| 军事| 额敏县| 浦县| 霞浦县| 石河子市| 广州市| 松溪县| 龙海市| 云龙县| 天长市| 巴里| 华坪县| 梧州市| 榆中县| 牡丹江市|