掃二維碼與項目經理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網交流
這部分解釋了舊的 C 風格變長參數列表。了解這些內容很重要,因為你可能會在遺留代碼中遇到它們。然而,在新代碼中,你應該使用變參模板來實現類型安全的變長參數列表。

十年的君山網站建設經驗,針對設計、前端、開發(fā)、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。營銷型網站建設的優(yōu)勢是能夠根據用戶設備顯示端的尺寸不同,自動調整君山建站的顯示方式,使網站能夠適用不同顯示終端,在瀏覽器中調整網站的寬度,無論在任何一種瀏覽器上瀏覽網站,都能展現優(yōu)雅布局與設計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“君山網站設計”,“君山網站推廣”以來,每個客戶項目都認真落實執(zhí)行。
考慮 C 函數 printf(),來自
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,但如果沒有設置調試標志,則不執(zhí)行任何操作。就像 printf() 一樣,這個函數應該能夠打印具有任意數量和任意類型參數的字符串。一個簡單的實現如下:
#include
#include
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,后面跟著 ...(省略號)。它們代表任意數量和類型的參數。要訪問這些參數,你必須使用
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 作為第一個參數,以及要解釋的參數的類型。不幸的是,除非你提供明確的方式,否則無法知道參數列表的結尾。例如,你可以使第一個參數是參數數量的計數。或者,在你有一組指針的情況下,你可能需要最后一個指針是 nullptr。有許多方法,但它們都對程序員來說是繁瑣的。
下面的示例演示了調用者在第一個命名參數中指定提供了多少個參數的技術。該函數接受任意數量的 int 并打印出來:
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()。請注意,第一個參數指定將跟隨多少個整數。
printInts(5, 5, 4, 3, 2, 1);使用 C 風格的變長參數列表訪問參數并不安全。這種方法存在幾個風險,從 printInts() 函數可以看出:
警告:避免使用 C 風格的變長參數列表。建議傳遞一個 std::array 或 vector 的值、使用初始化列表,或者使用類型安全的變參模板來實現變長參數列表。

我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網交流