溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++中為什么不要使用可變參數(shù)

發(fā)布時間:2021-11-25 15:52:53 來源:億速云 閱讀:201 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“C++中為什么不要使用可變參數(shù)”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“C++中為什么不要使用可變參數(shù)”吧!

F.55 不要使用可變參數(shù)

Reason(原因)

從va_arg中讀出內(nèi)容的處理假設(shè)實際傳遞的數(shù)據(jù)類型是正確的。傳遞可變參數(shù)的處理假設(shè)數(shù)據(jù)會按照正確的類型被讀取。由于通常這兩種假設(shè)都不能在語言中強制達成安全,只能依靠編程規(guī)范以保證其正確。因此說都是脆弱的。

Example(示例)

int sum(...) {    // ...    while (/*...*/)        result += va_arg(list, int); // BAD, assumes it will be passed ints    // ...}
sum(3, 2); // oksum(3.14159, 2.71828); // BAD, undefined
template<class ...Args>auto sum(Args... args) { // GOOD, and much more flexible    return (... + args); // note: C++17 "fold expression"}
sum(3, 2); // ok: 5sum(3.14159, 2.71828); // ok: ~5.85987

譯者注:代碼中使用了兩種現(xiàn)代C++的新特性,一個是C++11中引入的可變參數(shù)模板(variadic template),另一個是C++17引入的折疊表達式(fold expression)。

Alternatives(備選方案)

  • overloading

    重載

  • variadic templates

    可變參數(shù)列表

  • variant arguments

    variant(C++17引入的變體數(shù)據(jù),譯者注)類型參數(shù)。

  • initializer_list (homogeneous)

    初始化列表(同類數(shù)據(jù)的情況)(C++11引入)

  • Note(注意)

定義一個...參數(shù)在無法決定實際參數(shù)類型時一種有用的技術(shù),尤其是定義可以接受任何東西的函數(shù)以便在重載版本中禁止“任何其他的東西”或者在模板元程序中表示包羅萬象的容器。

Enforcement(實施建議)

  • Issue a diagnostic for using va_list, va_start, or va_arg.

    發(fā)起對使用va_list,va_start或者va_arg的檢查。

  • Issue a diagnostic for passing an argument to a vararg parameter of a function that does not offer an overload for a more specific type in the position of the vararg. To fix: Use a different function, or [[suppress(types)]].

    發(fā)起針對以下情況的檢查:向函數(shù)的可變參數(shù)可變參數(shù)傳遞單獨的實參,而且不存在在可變參數(shù)位置定義了特定數(shù)據(jù)類型參數(shù)的重載函數(shù)。

    修改建議:使用不同的函數(shù)或者[[抑制((類型準則群組))]]

到此,相信大家對“C++中為什么不要使用可變參數(shù)”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI