2012-10-18 49 views
1

最近我想實現一個printf包裝器。一些搜索後,我發現了vprintf有利於這方面的需要:在C中帶有可變參數的函數的包裝器

void my_printf(const char *fmt, ...) 
{ 
    va_list args; 
    va_start(args, fmt); 
    vprintf(fmt, args); 
    va_end(args); 
} 

但它是可以實現的printf或可變參數,而不是va_list任何其他類似的功能,例如一個包裝?

(我的意思是,如果他們不提供什麼v版本?)


由於一些評論者沒有完全抓住了我的想法,我最好闡述它。

假設您有一個普通的printf函數,就像在C庫中一樣。

有人給你一個fmt字符串"%d %u %f"和相應的輸入。

現在你想寫一個類似於printf的函數,但是所有的%f都被%.2f所取代。

當然你也可以用兩個語句來完成這個任務:

replace(fmt, "%f", "%.2f"); 
printf(fmt, inputs); 

但是如果你使用這個功能很多次,也許你想有一個包裝,以節省一些時間。

當然,宏可以完成這個任務。但是,它可能沒有一個宏,如:

void myprintf(fmt, ...) 
{ 
    replace(fmt, "%f", "%.2f"); 
    printf(fmt, inputs); 
} 

這裏的問題是,你不知道如何與參數的myprintf...飼料內printf

希望澄清。

+0

我不明白你真正想要什麼。你是否想要變量參數而不必使用'va_list'? – Pablo

回答

3

如果你只是想用它來在輸出前加一個字符串,你可以使用可變宏。

#define MYPRINT(...) printf("toto has: " __VA_ARGS__) 
在簡單的例子

這suppposes你傳遞是一個字符串文字是格式,所以這是一個有點限制。但我希望你看到這個模式如何使用這種簡單的宏包裝。

2

當API不提供參數爲va_list函數時,沒有可移植的方式來構建對可變參數函數的調用。

但是,您可以[ab]使用libffi來實現此目的,方法是構建可變參數調用並執行此操作。