欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

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

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

  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語(yǔ)言中解決變參問(wèn)題的一組宏

void va_start(va_list ap, last_arg)

ap :是一個(gè) va_list 類型的對(duì)象,它用來(lái)存儲(chǔ)通過(guò) va_arg 獲取額外參數(shù)時(shí)所必需的信息。

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

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

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

void va_end(va_list ap)

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

下面給出用法示例:

#include <stdarg.h>

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

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

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

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

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

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

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

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

最常見(jiàn)的形式是有如下兩個(gè):

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

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

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

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

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

format的語(yǔ)法格式為:

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

下面給出2個(gè)示例:

一般函數(shù):

為自己定義的一個(gè)帶有可變參數(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是一個(gè)函數(shù)的成員函數(shù),那么m和n的值可有點(diǎn)“懸乎”了,例如:

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

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

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

相關(guān)文章

  • C++實(shí)現(xiàn)和電腦對(duì)戰(zhàn)三子棋實(shí)例

    C++實(shí)現(xiàn)和電腦對(duì)戰(zhàn)三子棋實(shí)例

    大家好,本篇文章主要講的是C++實(shí)現(xiàn)和電腦對(duì)戰(zhàn)三子棋實(shí)例,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • Matlab實(shí)現(xiàn)繪制有氣泡感的網(wǎng)絡(luò)圖

    Matlab實(shí)現(xiàn)繪制有氣泡感的網(wǎng)絡(luò)圖

    這篇文章主要介紹了如何利用Matlab實(shí)現(xiàn)繪制有氣泡感的網(wǎng)絡(luò)圖,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定的幫助,需要的可以參考一下
    2023-02-02
  • C語(yǔ)言數(shù)據(jù)的存儲(chǔ)超詳細(xì)講解下篇浮點(diǎn)型在內(nèi)存中的存取

    C語(yǔ)言數(shù)據(jù)的存儲(chǔ)超詳細(xì)講解下篇浮點(diǎn)型在內(nèi)存中的存取

    使用編程語(yǔ)言進(jìn)行編程時(shí),需要用到各種變量來(lái)存儲(chǔ)各種信息。變量保留的是它所存儲(chǔ)的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個(gè)變量時(shí),就會(huì)在內(nèi)存中保留一些空間。您可能需要存儲(chǔ)各種數(shù)據(jù)類型的信息,操作系統(tǒng)會(huì)根據(jù)變量的數(shù)據(jù)類型,來(lái)分配內(nèi)存和決定在保留內(nèi)存中存儲(chǔ)什么
    2022-04-04
  • C++中構(gòu)造函數(shù)與析構(gòu)函數(shù)的詳解及其作用介紹

    C++中構(gòu)造函數(shù)與析構(gòu)函數(shù)的詳解及其作用介紹

    這篇文章主要介紹了C++中構(gòu)造函數(shù)與析構(gòu)函數(shù)的詳解及其作用介紹,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • C語(yǔ)言實(shí)現(xiàn)電器銷售管理系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)電器銷售管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)電器銷售管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • opencv2基于SURF特征提取實(shí)現(xiàn)兩張圖像拼接融合

    opencv2基于SURF特征提取實(shí)現(xiàn)兩張圖像拼接融合

    這篇文章主要為大家詳細(xì)介紹了opencv2基于SURF特征提取實(shí)現(xiàn)兩張圖像拼接融合,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • Qt QTreeWidget 樹形結(jié)構(gòu)實(shí)現(xiàn)代碼

    Qt QTreeWidget 樹形結(jié)構(gòu)實(shí)現(xiàn)代碼

    Qt中實(shí)現(xiàn)樹形結(jié)構(gòu)可以使用QTreeWidget類,也可以使用QTreeView類,QTreeWidget繼承自QTreeView類,接下來(lái)通過(guò)本文給大家介紹Qt QTreeWidget 樹形結(jié)構(gòu)實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2021-11-11
  • C語(yǔ)言中的指針新手初階指南

    C語(yǔ)言中的指針新手初階指南

    指針是C語(yǔ)言的靈魂,精華之所在,指針強(qiáng)大而危險(xiǎn),用得好是一大利器,用得不好是一大潛在危害,下面這篇文章主要給大家介紹了C語(yǔ)言中指針的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-10-10
  • 基于Qt編寫全能播放組件的示例代碼

    基于Qt編寫全能播放組件的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何基于Qt編寫全能播放組件,可以支持ffmpeg2/3/4/5/6/Qt4/5/6,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-06-06
  • C語(yǔ)言程序環(huán)境編譯+鏈接理論

    C語(yǔ)言程序環(huán)境編譯+鏈接理論

    這篇文章主要介紹了C語(yǔ)言程序環(huán)境編譯+鏈接理論,下面文章基于C語(yǔ)言的相關(guān)資料展開對(duì)編譯和鏈接的詳細(xì)介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-04-04

最新評(píng)論