C で可変個引数関数の呼び出しを転送する

vfprintf に相当する関数がない場合 va_list かかる 可変数の引数の代わりに、できません . http://c-faq.com/varargs/handoff.html を参照してください。

例:

void myfun(const char *fmt, va_list argp) {
    vfprintf(stderr, fmt, argp);
}

直接ではありませんが、可変個引数関数が varargs とペアになるのは一般的です (そして、標準ライブラリではほぼ普遍的なケースです)。 スタイル代替機能。例えば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 スタイルのコンパニオンを使用できるようにすることも検討する必要があります。あなたの質問からわかるように、それはあなたのユーザーにとって有用であることがわかります.


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_list を使用するのが最善の解決策です。 ラップしようとしている関数の形式 (存在する場合)。