本篇內(nèi)容主要講解“C++中為什么不要使用可變參數(shù)”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“C++中為什么不要使用可變參數(shù)”吧!
目前創(chuàng)新互聯(lián)公司已為近千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、網(wǎng)站托管、服務(wù)器租用、企業(yè)網(wǎng)站設(shè)計(jì)、棲霞網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
F.55 不要使用可變參數(shù)
Reason(原因)
從va_arg中讀出內(nèi)容的處理假設(shè)實(shí)際傳遞的數(shù)據(jù)類型是正確的。傳遞可變參數(shù)的處理假設(shè)數(shù)據(jù)會(huì)按照正確的類型被讀取。由于通常這兩種假設(shè)都不能在語(yǔ)言中強(qiáng)制達(dá)成安全,只能依靠編程規(guī)范以保證其正確。因此說(shuō)都是脆弱的。
Example(示例)
int sum(...) {
// ...
while (/*...*/)
result += va_arg(list, int); // BAD, assumes it will be passed ints
// ...
}
sum(3, 2); // ok
sum(3.14159, 2.71828); // BAD, undefined
template
auto sum(Args... args) { // GOOD, and much more flexible
return (... + args); // note: C++17 "fold expression"
}
sum(3, 2); // ok: 5
sum(3.14159, 2.71828); // ok: ~5.85987
譯者注:代碼中使用了兩種現(xiàn)代C++的新特性,一個(gè)是C++11中引入的可變參數(shù)模板(variadic template),另一個(gè)是C++17引入的折疊表達(dá)式(fold expression)。
Alternatives(備選方案)
overloading
重載
variadic templates
可變參數(shù)列表
variant
arguments
variant(C++17引入的變體數(shù)據(jù),譯者注)類型參數(shù)。
initializer_list
(homogeneous)
初始化列表(同類數(shù)據(jù)的情況)(C++11引入)
Note(注意)
定義一個(gè)...參數(shù)在無(wú)法決定實(shí)際參數(shù)類型時(shí)一種有用的技術(shù),尤其是定義可以接受任何東西的函數(shù)以便在重載版本中禁止“任何其他的東西”或者在模板元程序中表示包羅萬(wàn)象的容器。
Enforcement(實(shí)施建議)
Issue a diagnostic for using va_list
, va_start
, or va_arg
.
發(fā)起對(duì)使用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ā)起針對(duì)以下情況的檢查:向函數(shù)的可變參數(shù)可變參數(shù)傳遞單獨(dú)的實(shí)參,而且不存在在可變參數(shù)位置定義了特定數(shù)據(jù)類型參數(shù)的重載函數(shù)。
修改建議:使用不同的函數(shù)或者[[抑制((類型準(zhǔn)則群組))]]
到此,相信大家對(duì)“C++中為什么不要使用可變參數(shù)”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!