可變引數實現log列印

2021-08-04 04:07:40 字數 1123 閱讀 5054

實現步驟如下: 

1. 函式原型中使用省略號; 

2. 函式定義中建立乙個va_list變數; 

3. 初始化va_list變數; 

4. 訪問引數列表; 

5. 完成清理工作; 

上述步驟的實現需要使用到四個巨集:va_list、va_start(va_list, arg)、va_arg(va_list, type)、va_end(va_list)這些巨集在標頭檔案stdarg.h中宣告定義。因此使用時需要包含該標頭檔案。

#include "stdafx.h"

#include using namespace std;

void trace_info(const char* file, const char* func, int line, const char* format, ...)

#define __trace_info__(...) trace_info(__file__, __function__, __line__, __va_args__);

int _tmain(int argc, _tchar* argv)

使用這種方法需要注意一下幾點: 

1. 函式原型中,省略號必須在引數列表的末尾:也就是說,在函式原型中引數列表省略號的右邊不能再出現確定引數; 

2.執行時,函式必須能夠根據已有資訊(既有約定,或確定實參)確定可變引數的具體個數與型別:函式定義需要知道可變引數的具體型別、個數,這些資訊是在執行時確定的,那麼顯然應該由實參來確定。

3. 使用完成時需要用va_end()做清理工作,可變引數巨集可能使用了動態分配的記憶體,忘記執行清理操作有可能導致記憶體洩漏等問題; 

4.可變引數巨集只能實現順序訪問可變引數,無法後退訪問,但是可以在清理操作完成後重新使用va_start初始化va_list變數,重新遍歷形參表; 

5.該方法是極不安全的,巨集本身無法提供任何安全性保證,他總是按照既定**「自作多情」的認為實參就應該是那麼多,即使實參並不是那麼多。這就要求所有安全性必須由程式設計師來保證。例如,在以上的示例**中,如果呼叫時指定count為10,但實際上只給出9個可變形參,那麼函式還是會讀取10個引數,顯然第十次讀取是多餘的,多餘的操作一般不會有什麼好結果,當然如果實參過多,多餘的實參也不會被讀取而是被忽略。

vsnprintf列印可變引數的log

vsnprintf,c語言庫函式之一,屬於可變引數。用於向字串中列印資料 資料格式使用者自定義。標頭檔案 include 函式宣告 int vsnprintf char str,size tsize,constchar format,va listap 引數說明 char str out 把生成的格...

可變引數列印 解析可變引數

1.的一般用法 define str s s define cons a,b int a e b int main 2.接受,列印可變引數 參考 glibc庫的bebug函式 define printf fmt,args.printf fmt,args 使用方法 define pr debug fm...

使用巨集的可變引數來構造列印Log巨集

define test debug ifdef test debug define dbg err fmt,args printf fmt,file function line args endif void printf erro int a,int b else void main 測試結果 c...