博客專欄

EEPW首頁 > 博客 > 可變參數(shù)實現(xiàn)log打印

可變參數(shù)實現(xiàn)log打印

發(fā)布人:電子禪石 時間:2020-08-27 來源:工程師 發(fā)布文章

實現(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)系工作人員刪除。

手機電池相關文章:手機電池修復


晶體管相關文章:晶體管工作原理


晶體管相關文章:晶體管原理
雙控開關相關文章:雙控開關原理


關鍵詞:

相關推薦

技術專區(qū)

關閉