2010-01-13 102 views
22

可能重複:
C Programming: Forward variable argument list.是否有可能編寫一個可變參數列表函數將參數列表發送給另一個可變參數函數?

我想要做的是將數據發送到一個日誌庫(我不能modfify)在一個printf的一種方式。

所以我想一個函數是這樣的:

void log_DEBUG(const char* fmt, ...) { 
    char buff[SOME_PROPER_LENGTH]; 
    sprintf(buff, fmt, <varargs>); 
    log(DEBUG, buff); 
} 

我可以通過可變參數到另一個可變參數的功能以某種方式?

+1

杜佩:http://stackoverflow.com/questions/1719784/c-programming-forward-variable-argument-list – 2010-01-13 21:59:17

回答

25

您無法轉發變量參數列表,因爲無法將...下面的內容作爲參數表達到另一個函數。

但是你可以建立從...參數va_list和發送到將正確地格式化它的功能。這是vsprintf的用途。例如:

void log_DEBUG(const char* fmt, ...) { 
    char buff[SOME_PROPER_LENGTH]; 
    va_list args; 
    va_start(args, fmt); 
    vsprintf(buff, fmt, args); 
    va_end(args); 
    log(DEBUG, buff); 
} 
+1

別忘了** va_end ** – 2010-01-13 22:15:18

+0

@Nikolai N Fetissov:謝謝,修正。 – 2010-01-13 22:18:22

+3

我在這裏沒有看到任何非標準的東西。 – 2010-01-13 22:26:03

3

不是標準的C++。

+0

右,在C++中這將是優選使用''<<究竟 – ezpz 2010-01-13 22:20:01

7

這就是爲什麼你有vprintf功能家族。

4

根據您的具體要求,您可以使用vsprintf。我的C/C++太生鏽了,以至於當另一個函數不是爲它設計的時候,是否有一種簡單的方法可以實現它(沒有進入難看的堆棧操作),但我傾向於認爲不是。

13

您可以將它發送到以va_list作爲參數的另一個函數。除此之外,沒有其他辦法了,只能用手工製作asm,或者做一些可怕的猜謎遊戲來找出參數的「數量」。

這會工作:

void log_DEBUG(const char* fmt, ...) 
{ 
    va_list va; 
    va_start(va,fmt); 
    char buff[blah]; 
    vsprintf(buff,fmt,va); 
    log(DEBUG,buff); 
    va_end(va); 
} 

基本上,只要你寫一個函數,......,你應該寫另一個版本,需要的va_list - 如果要啓用這個了禮貌的事類型的鏈接調用。

+0

我需要什麼。我想也許有人直接通過arg列表,但vsprintf會做得很好! – 2010-01-13 22:03:00

+0

接受的答案錯過了「vsprintf」點,這就是爲什麼許多人(包括我)會谷歌這個答案。 – perfectionist 2013-09-16 13:49:30

相關問題