2014-03-14 44 views
1

我有以下宏:爲什麼在使用__VA_ARGS__從宏調用函數時「vsprintf」卡住了?

#define TRACE__LOW(str, col, ...)\ 
     TR_Trace("\r\e[" COLOR(col) "%s :: %s():%d; LOW - " str "\e[0m\r\n",\ 
     ##__VA_ARGS__); 

而且功能TR_Trace看起來是這樣的:

void TR_Trace(const char *const string, ...) 
{ 
    va_list aptr; 
    size_t stringSize = 0; 
    char tempString[250]; 

    va_start(aptr, string); 
    vsprintf(tempString, string, aptr); 
    va_end(aptr); 
} 

而我使用它是這樣的:

TRACE__LOW("Led[%d] toggled every %d milliseconds (%5d)", GREEN 
      init_parameters.led, delay_time, counter++); 

問題這裏是一旦執行到vsprintf(tempString,string,aptr);它卡在那裏。

是否有人知道發生了什麼,或者如果我沒有正確使用這個VA_ARGS

問候。

+0

你是什麼意思 「卡住」 是什麼意思?另外,你的意思是使用'vprintf()'而不是'vsprintf()'? – augurar

+0

你不應該在'__VA_ARGS__'之前使用'##';你不會將它粘貼到另一個字符串上。什麼是'綠色',它應該是'綠色',?否則我不明白這一行。 –

+1

@MattMcNabb ## __ VA_ARGS__是已知的擴展名,當__VA_ARGS__爲空時可以去掉','符號。它實際上是正確的(但非標準)。 – keltar

回答

4

您將%s :: %s():%d;添加到格式字符串,但不要添加額外的參數來填充這些模式。

我想它的意思是

#define TRACE__LOW(str, col, ...)\ 
     TR_Trace("\r\e[" COLOR(col) "%s :: %s():%d; LOW - " str "\e[0m\r\n",\ 
     __FILE__, __func__, __LINE__,\ 
     ##__VA_ARGS__); 
+0

你是對的!當我修改宏以添加__VA_ARGS__時,我擦除了「__FILE__,__func__,__LINE__」參數,這是問題所在。 – m4l490n

0

隨想:

您使用的__VA_ARGS__似乎是正確的。

TRACE__LOW宏在輸出中添加了一個多餘的分號(可能會導致沒有大括號的條件語句出現問題)。

我不知道COLOR(GREEN)擴展到,所以這可能是問題的根源。

建議:

你的編譯器應該有一個選項輸出從預處理的結果。在編譯器中,我使用的是-E。如果你有編譯器輸出預處理器的結果,你可以精確地看到你的宏擴展到了什麼地方。

例如,編譯下面的代碼與-E

#include <stdio.h> 

#define TRACE__LOW(str, col, ...)\ 
TR_Trace("\r\e[" COLOR(col) "%s :: %s():%d; LOW - " str "\e[0m\r\n",\ 
##__VA_ARGS__); 

int main(void) 
{ 
    TRACE__LOW("test", 3, a, b, c); 
} 

,輸出結果(後約500萬其他線路;))

int main(void) 
{ 
    TR_Trace("\r\e[" COLOR(3) "%s :: %s():%d; LOW - " "test" "\e[0m\r\n", a, b, c);; 
}