2016-08-12 68 views
1

我需要打包一個宏以便可以使用函數訪問宏。 宏的定義如下:使用可變數量的參數換行宏

#define gDbgLog(fmt,...) dbgLog(g_pdbg,MODULE_NAME,__FUNCTION__,fmt,##__VA_ARGS__) 

,我已經試圖把它包起來,如:

void pMonDbgLog(char* fmt, ...) 
{ 
    va_list args; 
    va_start(args,fmt); 
    gDbgLog(fmt,args); 
    va_end(args); 
} 

fmt似乎都經過精細的參數(INT)似乎得到了慘敗。我把它想:

int x = 51144; 
pMonDbgLog("some text %d",x); 

和我所得到的是「一些文本642129608」同時調用宏一樣,直接DbgLog("some text %d",x);工作正常。爲什麼是這樣?

dbgLog()包裝vsnprintf()生成輸出。

+0

它看起來像你的示例用法,你可以直接調用宏,即'gDbgLog(「一些文本%d」,x);'。你爲什麼認爲你需要一個函數包裝? – bgoldst

回答

0

渦卷宏用的參數可變數目

它根本是不可能的「擴展」一valist到的參數的變量數目和這些信息傳遞給一個可變參數的功能上運行時,至少沒有任何額外的助手(它們不是C的一部分,並且不可移植並且可能不適用於您的實現/平臺)。

gDbgLog()希望得到每個參數傳遞分別

gDbgLog("%s %d", "hello, world", 42); 

你所顯示的代碼並取而代之的是正好路過一個參數作爲__VA_ARGS__部分的valist即值。

gDbgLog(fmt,args); 

如何解決這個問題?

dbgLog()會封裝vsnprintf()來生成輸出。

所以剛落gDbgLog()pMonDbgLog()調用vsnprintf()直接傳遞valist作爲初始化由代碼片斷告訴你。