博客專欄

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

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

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

實(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)原理


關(guān)鍵詞:

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉