日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

C 語言變長(zhǎng)參數(shù)及其陷阱

來源: 責(zé)編: 時(shí)間:2023-12-05 09:25:47 285觀看
導(dǎo)讀C 工具變長(zhǎng)參數(shù)列表這部分解釋了舊的 C 風(fēng)格變長(zhǎng)參數(shù)列表。了解這些內(nèi)容很重要,因?yàn)槟憧赡軙?huì)在遺留代碼中遇到它們。然而,在新代碼中,你應(yīng)該使用變參模板來實(shí)現(xiàn)類型安全的變長(zhǎng)參數(shù)列表。考慮 C 函數(shù) printf(),來自 <cstdi

DEO28資訊網(wǎng)——每日最新資訊28at.com

C 工具

變長(zhǎng)參數(shù)列表

這部分解釋了舊的 C 風(fēng)格變長(zhǎng)參數(shù)列表。了解這些內(nèi)容很重要,因?yàn)槟憧赡軙?huì)在遺留代碼中遇到它們。然而,在新代碼中,你應(yīng)該使用變參模板來實(shí)現(xiàn)類型安全的變長(zhǎng)參數(shù)列表。DEO28資訊網(wǎng)——每日最新資訊28at.com

考慮 C 函數(shù) printf(),來自 <cstdio>。你可以用任意數(shù)量的參數(shù)調(diào)用它:DEO28資訊網(wǎng)——每日最新資訊28at.com

printf("int %d/n", 5);printf("String %s and int %d/n", "hello", 5);printf("Many ints: %d, %d, %d, %d, %d/n", 1, 2, 3, 4, 5);

C/C++ 提供了語法和一些實(shí)用宏,用于編寫你自己的變長(zhǎng)參數(shù)函數(shù)。這些函數(shù)通常看起來很像 printf()。盡管你不經(jīng)常需要這個(gè)特性,但偶爾你會(huì)遇到它相當(dāng)有用的情況。例如,假設(shè)你想編寫一個(gè)快速而簡(jiǎn)單的調(diào)試函數(shù),當(dāng)設(shè)置了調(diào)試標(biāo)志時(shí),該函數(shù)將字符串打印到 stderr,但如果沒有設(shè)置調(diào)試標(biāo)志,則不執(zhí)行任何操作。就像 printf() 一樣,這個(gè)函數(shù)應(yīng)該能夠打印具有任意數(shù)量和任意類型參數(shù)的字符串。一個(gè)簡(jiǎn)單的實(shí)現(xiàn)如下:DEO28資訊網(wǎng)——每日最新資訊28at.com

#include <cstdio>#include <cstdarg>bool debug { false };void debugOut(const char* str, ...) {    va_list ap;    if (debug) {        va_start(ap, str);        vfprintf(stderr, str, ap);        va_end(ap);    }}

首先,請(qǐng)注意 debugOut() 的原型包含一個(gè)類型化且命名的參數(shù) str,后面跟著 ...(省略號(hào))。它們代表任意數(shù)量和類型的參數(shù)。要訪問這些參數(shù),你必須使用 <cstdarg> 中定義的宏。你聲明一個(gè) va_list 類型的變量,并用 va_start 調(diào)用進(jìn)行初始化。va_start() 的第二個(gè)參數(shù)必須是參數(shù)列表中最右邊的命名變量。所有具有變長(zhǎng)參數(shù)列表的函數(shù)都至少需要一個(gè)命名參數(shù)。debugOut() 函數(shù)簡(jiǎn)單地將這個(gè)列表傳遞給 vfprintf()(<cstdio> 中的標(biāo)準(zhǔn)函數(shù))。vfprintf() 調(diào)用返回后,debugOut() 調(diào)用 va_end() 來終止訪問變量參數(shù)列表。在調(diào)用 va_start() 后,你必須始終調(diào)用 va_end(),以確保函數(shù)以一致的堆棧狀態(tài)結(jié)束。你可以如下方式使用該函數(shù):DEO28資訊網(wǎng)——每日最新資訊28at.com

debug = true;debugOut("int %d/n", 5);debugOut("String %s and int %d/n", "hello", 5);debugOut("Many ints: %d, %d, %d, %d, %d/n", 1, 2, 3, 4, 5);

訪問參數(shù)

如果你想自己訪問實(shí)際參數(shù),你可以使用 va_arg() 來做到這一點(diǎn)。它接受 va_list 作為第一個(gè)參數(shù),以及要解釋的參數(shù)的類型。不幸的是,除非你提供明確的方式,否則無法知道參數(shù)列表的結(jié)尾。例如,你可以使第一個(gè)參數(shù)是參數(shù)數(shù)量的計(jì)數(shù)。或者,在你有一組指針的情況下,你可能需要最后一個(gè)指針是 nullptr。有許多方法,但它們都對(duì)程序員來說是繁瑣的。DEO28資訊網(wǎng)——每日最新資訊28at.com

下面的示例演示了調(diào)用者在第一個(gè)命名參數(shù)中指定提供了多少個(gè)參數(shù)的技術(shù)。該函數(shù)接受任意數(shù)量的 int 并打印出來:DEO28資訊網(wǎng)——每日最新資訊28at.com

void printInts(size_t num, ...) {    va_list ap;    va_start(ap, num);    for (size_t i { 0 }; i < num; ++i) {        int temp { va_arg(ap, int) };        cout << temp << " ";    }    va_end(ap);    cout << endl;}

你可以按以下方式調(diào)用 printInts()。請(qǐng)注意,第一個(gè)參數(shù)指定將跟隨多少個(gè)整數(shù)。DEO28資訊網(wǎng)——每日最新資訊28at.com

printInts(5, 5, 4, 3, 2, 1);

為什么不應(yīng)使用 C 風(fēng)格的變長(zhǎng)參數(shù)列表

訪問風(fēng)險(xiǎn)

使用 C 風(fēng)格的變長(zhǎng)參數(shù)列表訪問參數(shù)并不安全。這種方法存在幾個(gè)風(fēng)險(xiǎn),從 printInts() 函數(shù)可以看出:DEO28資訊網(wǎng)——每日最新資訊28at.com

  • 不知道參數(shù)的數(shù)量:在 printInts() 的情況下,你必須信任調(diào)用者作為第一個(gè)參數(shù)傳遞正確數(shù)量的參數(shù)。在 debugOut() 的情況下,你必須信任調(diào)用者在字符數(shù)組后傳遞的參數(shù)數(shù)量與字符數(shù)組中的格式化代碼數(shù)量相同。
  • 不知道參數(shù)的類型:va_arg() 接受一個(gè)類型,用它來解釋其當(dāng)前位置的值。然而,你可以告訴 va_arg() 將值解釋為任何類型。它無法驗(yàn)證正確的類型。

警告:避免使用 C 風(fēng)格的變長(zhǎng)參數(shù)列表。建議傳遞一個(gè) std::array 或 vector 的值、使用初始化列表,或者使用類型安全的變參模板來實(shí)現(xiàn)變長(zhǎng)參數(shù)列表。DEO28資訊網(wǎng)——每日最新資訊28at.com

DEO28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-38135-0.htmlC 語言變長(zhǎng)參數(shù)及其陷阱

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 一次性講清楚「連接池獲取連接慢」的所有原因|

下一篇: 三分鐘搞懂CUDA和GPU編程

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 小米降噪藍(lán)牙耳機(jī)Necklace分享:聽一首歌 讀懂一個(gè)故事

    在今天下午的小米Civi 2新品發(fā)布會(huì)上,小米還帶來了一款新的降噪藍(lán)牙耳機(jī)Necklace,我們也在發(fā)布結(jié)束的第一時(shí)間給大家?guī)磉@款耳機(jī)的簡(jiǎn)單分享。現(xiàn)在大家能見到最多的藍(lán)牙耳機(jī)
  • Golang 中的 io 包詳解:組合接口

    io.ReadWriter// ReadWriter is the interface that groups the basic Read and Write methods.type ReadWriter interface { Reader Writer}是對(duì)Reader和Writer接口的組合,
  • 量化指標(biāo)是與非:挽救被量化指標(biāo)扼殺的技術(shù)團(tuán)隊(duì)

    作者 | 劉新翠整理 | 徐杰承本文整理自快狗打車技術(shù)總監(jiān)劉新翠在WOT2023大會(huì)上的主題分享,更多精彩內(nèi)容及現(xiàn)場(chǎng)PPT,請(qǐng)關(guān)注51CTO技術(shù)棧公眾號(hào),發(fā)消息【W(wǎng)OT2023PPT】即可直接領(lǐng)取
  • 十個(gè)簡(jiǎn)單但很有用的Python裝飾器

    裝飾器(Decorators)是Python中一種強(qiáng)大而靈活的功能,用于修改或增強(qiáng)函數(shù)或類的行為。裝飾器本質(zhì)上是一個(gè)函數(shù),它接受另一個(gè)函數(shù)或類作為參數(shù),并返回一個(gè)新的函數(shù)或類。它們通常用
  • 多線程開發(fā)帶來的問題與解決方法

    使用多線程主要會(huì)帶來以下幾個(gè)問題:(一)線程安全問題  線程安全問題指的是在某一線程從開始訪問到結(jié)束訪問某一數(shù)據(jù)期間,該數(shù)據(jù)被其他的線程所修改,那么對(duì)于當(dāng)前線程而言,該線程
  • 梁柱接棒兩年,騰訊音樂闖出新路子

    文丨田靜 出品丨牛刀財(cái)經(jīng)(niudaocaijing)7月5日,企鵝FM發(fā)布官方公告稱由于業(yè)務(wù)調(diào)整,將于9月6日正式停止運(yùn)營,這意味著騰訊音樂長(zhǎng)音頻業(yè)務(wù)走向消亡。騰訊在長(zhǎng)音頻領(lǐng)域還在摸索。為
  • 10天營收超1億美元,《星鐵》比《原神》差在哪?

    來源:伯虎財(cái)經(jīng)作者:陳平安即便你沒玩過《原神》,你一定聽說過的它的大名。恨它的人把《原神》開服那天稱作是中國游戲史上最黑暗的一天,有粉絲因?yàn)樗髂嵩赑S平臺(tái)上線《原神》,怒而
  • 年輕人的“職場(chǎng)羞恥感”,無處不在

    作者:馮曉亭 陶 淘 李 欣 張 琳 馬舒葉來源:燃次元&ldquo;人在職場(chǎng),應(yīng)該選擇什么樣的著裝?&rdquo;近日,在網(wǎng)絡(luò)上,一個(gè)與著裝相關(guān)的帖子引發(fā)關(guān)注,在該帖子里,一位在高級(jí)寫字樓亞洲金
  • 華為將推出盤古數(shù)字人大模型 可幫助用戶12小時(shí)完成數(shù)字人生成

    在今日舉行的2023年華為云數(shù)字文娛AI創(chuàng)新峰會(huì)上,華為云全球Marketing與銷售服務(wù)總裁石冀琳表示,華為云將在后續(xù)推出盤古數(shù)字人大模型,可幫助用戶12小
Top 主站蜘蛛池模板: 乌审旗| 应城市| 阿拉尔市| 石棉县| 临汾市| 红河县| 韩城市| 遵化市| 涞水县| 禄丰县| 铜山县| 馆陶县| 通许县| 宁波市| 洪雅县| 宁安市| 阳山县| 山阴县| 威海市| 孟村| 汾西县| 界首市| 九江市| 黄梅县| 大关县| 威宁| 盐池县| 土默特左旗| 龙川县| 临邑县| 张家川| 伊吾县| 玉溪市| 卢氏县| 遂平县| 新平| 烟台市| 霍林郭勒市| 宣化县| 齐齐哈尔市| 金平|