可變參數(shù)實(shí)現(xiàn)log打印
實(shí)現(xiàn)步驟如下:
1. 函數(shù)原型中使用省略號(hào);
?。? 函數(shù)定義中創(chuàng)建一個(gè)va_list變量;
3. 初始化va_list變量;
4. 訪問(wèn)參數(shù)列表;
5. 完成清理工作;
上述步驟的實(shí)現(xiàn)需要使用到四個(gè)宏:va_list、va_start(va_list, arg)、va_arg(va_list, type)、va_end(va_list)這些宏在頭文件stdarg.h中聲明定義。因此使用時(shí)需要包含該頭文件
#include "stdafx.h" #include <stdarg.h> using namespace std; void trace_info(const char* file, const char* func, int line, const char* format, ...){ fprintf(stdout, "[%s:%d]%s: ", file, line, func); va_list vaList; va_start(vaList, format); vfprintf(stdout, format, vaList); va_end(vaList); fprintf(stdout, "%c", '\n'); } #define __TRACE_INFO__(...) trace_info(__FILE__, __FUNCTION__, __LINE__, __VA_ARGS__); int _tmain(int argc, _TCHAR* argv[]) { __TRACE_INFO__("error code is %d", 1); __TRACE_INFO__("error code is %d", 2); return 0; }
使用這種方法需要注意一下幾點(diǎn):
1. 函數(shù)原型中,省略號(hào)必須在參數(shù)列表的末尾:也就是說(shuō),在函數(shù)原型中參數(shù)列表省略號(hào)的右邊不能再出現(xiàn)確定參數(shù);
2.運(yùn)行時(shí),函數(shù)必須能夠根據(jù)已有信息(既有約定,或確定實(shí)參)確定可變參數(shù)的具體個(gè)數(shù)與類型:函數(shù)定義需要知道可變參數(shù)的具體類型、個(gè)數(shù),這些信息是在運(yùn)行時(shí)確定的,那么顯然應(yīng)該由實(shí)參來(lái)確定。
3. 使用完成時(shí)需要用va_end()做清理工作,可變參數(shù)宏可能使用了動(dòng)態(tài)分配的內(nèi)存,忘記執(zhí)行清理操作有可能導(dǎo)致內(nèi)存泄漏等問(wèn)題;
4.可變參數(shù)宏只能實(shí)現(xiàn)順序訪問(wèn)可變參數(shù),無(wú)法后退訪問(wèn),但是可以在清理操作完成后重新使用va_start初始化va_list變量,重新遍歷形參表;
5.該方法是極不安全的,宏本身無(wú)法提供任何安全性保證,他總是按照既定代碼“自作多情”的認(rèn)為實(shí)參就應(yīng)該是那么多,即使實(shí)參并不是那么多。這就要求所有安全性必須由程序員來(lái)保證。例如,在以上的示例代碼中,如果調(diào)用時(shí)指定count為10,但實(shí)際上只給出9個(gè)可變形參,那么函數(shù)還是會(huì)讀取10個(gè)參數(shù),顯然第十次讀取是多余的,多余的操作一般不會(huì)有什么好結(jié)果,當(dāng)然如果實(shí)參過(guò)多,多余的實(shí)參也不會(huì)被讀取而是被忽略。
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。
手機(jī)電池相關(guān)文章:手機(jī)電池修復(fù)
晶體管相關(guān)文章:晶體管工作原理
晶體管相關(guān)文章:晶體管原理 雙控開(kāi)關(guān)相關(guān)文章:雙控開(kāi)關(guān)原理