亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在C中轉發對變量函數的調用

在C中轉發對變量函數的調用

C C++
慕森卡 2019-07-12 09:48:15
在C中轉發對變量函數的調用在C中,是否可以轉發變量函數的調用?就像在,int my_printf(char *fmt, ...) {     fprintf(stderr, "Calling printf with fmt %s", fmt);     return SOMEHOW_INVOKE_LIBC_PRINTF;}在這種情況下,以上述方式轉發調用顯然不是必要的(因為您可以其他方式記錄調用,也可以使用vfprintf),但是我正在處理的代碼庫要求包裝器執行一些實際的工作,并且沒有(也不能添加)類似于vfprintf的助手函數。[最新情況:根據迄今提供的答案,似乎有些混亂。用另一種方式來表達這個問題:一般來說,你能把一些任意的變量函數包裝起來嗎?而不修改該函數的定義.]
查看完整描述

3 回答

?
互換的青春

TA貢獻1797條經驗 獲得超6個贊

不是直接的,但是,在標準庫中,變量函數以成對的形式出現在標準庫中是很常見的(在標準庫中,這幾乎是普遍的情況)。varargs風格替代功能。G.printf/vprintf

那個V.。函數采用va_list參數,其實現通常使用編譯器特定的“宏魔術”,但您可以保證調用v.像這樣的變量函數的樣式函數可以工作:

#include <stdarg.h>int m_printf(char *fmt, ...){
    int ret;

    /* Declare a va_list type variable */
    va_list myargs;

    /* Initialise the va_list variable with the ... after fmt */

    va_start(myargs, fmt);

    /* Forward the '...' to vprintf */
    ret = vprintf(fmt, myargs);

    /* Clean up the va_list */
    va_end(myargs);

    return ret;}

這應該會給你想要的效果。

如果考慮編寫各種庫函數,還應該考慮將va_List樣式的伙伴作為庫的一部分。正如您可以從您的問題中看到的,它可以證明對您的用戶是有用的。


查看完整回答
反對 回復 2019-07-12
?
忽然笑

TA貢獻1806條經驗 獲得超5個贊

C99支架帶有各種參數的宏;根據編譯器的不同,您可能可以聲明一個宏來執行您想要的操作:

#define my_printf(format, ...) \    do { \
        fprintf(stderr, "Calling printf with fmt %s\n", format); \
        some_other_variadac_function(format, ##__VA_ARGS__); \
    } while(0)

不過,一般來說,最好的解決方案是使用Va列表您試圖包裝的函數的形式,如果存在的話。


查看完整回答
反對 回復 2019-07-12
  • 3 回答
  • 0 關注
  • 497 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號