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