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

當前位置:首頁 > 科技  > 軟件

C 語言變長參數及其陷阱

來源: 責編: 時間:2023-12-05 09:25:47 327觀看
導讀C 工具變長參數列表這部分解釋了舊的 C 風格變長參數列表。了解這些內容很重要,因為你可能會在遺留代碼中遇到它們。然而,在新代碼中,你應該使用變參模板來實現類型安全的變長參數列表。考慮 C 函數 printf(),來自 <cstdi

Ye328資訊網——每日最新資訊28at.com

C 工具

變長參數列表

這部分解釋了舊的 C 風格變長參數列表。了解這些內容很重要,因為你可能會在遺留代碼中遇到它們。然而,在新代碼中,你應該使用變參模板來實現類型安全的變長參數列表。Ye328資訊網——每日最新資訊28at.com

考慮 C 函數 printf(),來自 <cstdio>。你可以用任意數量的參數調用它:Ye328資訊網——每日最新資訊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++ 提供了語法和一些實用宏,用于編寫你自己的變長參數函數。這些函數通??雌饋砗芟?nbsp;printf()。盡管你不經常需要這個特性,但偶爾你會遇到它相當有用的情況。例如,假設你想編寫一個快速而簡單的調試函數,當設置了調試標志時,該函數將字符串打印到 stderr,但如果沒有設置調試標志,則不執行任何操作。就像 printf() 一樣,這個函數應該能夠打印具有任意數量和任意類型參數的字符串。一個簡單的實現如下:Ye328資訊網——每日最新資訊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);    }}

首先,請注意 debugOut() 的原型包含一個類型化且命名的參數 str,后面跟著 ...(省略號)。它們代表任意數量和類型的參數。要訪問這些參數,你必須使用 <cstdarg> 中定義的宏。你聲明一個 va_list 類型的變量,并用 va_start 調用進行初始化。va_start() 的第二個參數必須是參數列表中最右邊的命名變量。所有具有變長參數列表的函數都至少需要一個命名參數。debugOut() 函數簡單地將這個列表傳遞給 vfprintf()(<cstdio> 中的標準函數)。vfprintf() 調用返回后,debugOut() 調用 va_end() 來終止訪問變量參數列表。在調用 va_start() 后,你必須始終調用 va_end(),以確保函數以一致的堆棧狀態結束。你可以如下方式使用該函數:Ye328資訊網——每日最新資訊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);

訪問參數

如果你想自己訪問實際參數,你可以使用 va_arg() 來做到這一點。它接受 va_list 作為第一個參數,以及要解釋的參數的類型。不幸的是,除非你提供明確的方式,否則無法知道參數列表的結尾。例如,你可以使第一個參數是參數數量的計數?;蛘撸谀阌幸唤M指針的情況下,你可能需要最后一個指針是 nullptr。有許多方法,但它們都對程序員來說是繁瑣的。Ye328資訊網——每日最新資訊28at.com

下面的示例演示了調用者在第一個命名參數中指定提供了多少個參數的技術。該函數接受任意數量的 int 并打印出來:Ye328資訊網——每日最新資訊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;}

你可以按以下方式調用 printInts()。請注意,第一個參數指定將跟隨多少個整數。Ye328資訊網——每日最新資訊28at.com

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

為什么不應使用 C 風格的變長參數列表

訪問風險

使用 C 風格的變長參數列表訪問參數并不安全。這種方法存在幾個風險,從 printInts() 函數可以看出:Ye328資訊網——每日最新資訊28at.com

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

警告:避免使用 C 風格的變長參數列表。建議傳遞一個 std::array 或 vector 的值、使用初始化列表,或者使用類型安全的變參模板來實現變長參數列表。Ye328資訊網——每日最新資訊28at.com

Ye328資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-38135-0.htmlC 語言變長參數及其陷阱

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

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

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

標簽:
  • 熱門焦點
  • 一文看懂為蘋果Vision Pro開發應用程序

    譯者 | 布加迪審校 | 重樓蘋果的Vision Pro是一款混合現實(MR)頭戴設備。Vision Pro結合了虛擬現實(VR)和增強現實(AR)的沉浸感。其高分辨率顯示屏、先進的傳感器和強大的處理能力
  • SpringBoot中使用Cache提升接口性能詳解

    環境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPASpring 框架從 3.1 開始,對 Spring 應用程序提供了透明式添加緩存的支持。和事務支持一樣,抽象緩存允許一致地使用各
  • 一篇聊聊Go錯誤封裝機制

    %w 是用于錯誤包裝(Error Wrapping)的格式化動詞。它是用于 fmt.Errorf 和 fmt.Sprintf 函數中的一個特殊格式化動詞,用于將一個錯誤(或其他可打印的值)包裝在一個新的錯誤中。使
  • 一個注解實現接口冪等,這樣才優雅!

    場景碼猿慢病云管理系統中其實高并發的場景不是很多,沒有必要每個接口都去考慮并發高的場景,比如添加住院患者的這個接口,具體的業務代碼就不貼了,業務偽代碼如下:圖片上述代碼有
  • 猿輔導與新東方的兩種“歸途”

    作者|卓心月 出品|零態LT(ID:LingTai_LT)如何成為一家偉大企業?答案一定是對&ldquo;勢&rdquo;的把握,這其中最關鍵的當屬對企業戰略的制定,且能夠站在未來看現在,即使這其中的
  • 大廠卷向扁平化

    來源:新熵作者丨南枝 編輯丨月見大廠職級不香了。俗話說,兵無常勢,水無常形,互聯網企業調整職級體系并不稀奇。7月13日,淘寶天貓集團啟動了近年來最大的人力制度改革,目前已形成一
  • 英特爾Xe-HP項目終止,將專注Xe-HPC/HPG系列顯卡

    據10 月 31 日消息報道,英特爾高級副總裁兼加速計算系統和圖形事業部總經理 表示,Xe-HP“ Arctic Sound” 系列服務器 GPU 已經應用于 oneAPI devcloud 云服
  • 三翼鳥智能家居亮相電博會,讓用戶體驗更真實

    2021電博會在青島國際會展中心開幕中,三翼鳥直接把“家”搬到了現場,成為了展會的一大看點。這也是三翼鳥繼9月9日發布了行業首個一站式定制智慧家平臺后的
  • 世界人工智能大會國際日開幕式活動在世博展覽館開啟

    30日上午,世界人工智能大會國際日開幕式活動在世博展覽館開啟,聚集國際城市代表、重量級院士專家、國際創新企業代表,共同打造人工智能交流平臺。上海市副市
Top 主站蜘蛛池模板: 肥乡县| 黄陵县| 青州市| 高淳县| 安平县| 清丰县| 山西省| 溆浦县| 光山县| 龙州县| 福安市| 阿拉善左旗| 新竹县| 应城市| 阿合奇县| 苍梧县| 福州市| 荣成市| 馆陶县| 青海省| 垦利县| 依兰县| 双柏县| 鞍山市| 濮阳市| 景东| 林口县| 遂溪县| 江华| 山西省| 万荣县| 东海县| 邓州市| 星子县| 水富县| 清水县| 革吉县| 泸溪县| 新乡市| 南安市| 宁安市|