1

可変数の引数を受け入れるprintfのような関数を取り上げます。私がやりたいのは、これらの可変数の関数を、順序を変更せずにサブ関数に渡すことです。この例は、printf関数をconsoleと呼ばれる関数にエイリアスすることです...

#include <stdio.h>

void console(const char *_sFormat, ...);

int main () {
    console("Hello World!");
    return 0;
}

void console(const char *_sFormat, ...) {
    printf("[APP] %s\n", _sFormat);
}

たとえばconsole("Hello %s", sName)、名前をprintf関数にも渡したいのですが、printfがすでに行っているように、さまざまな数の引数を受け入れ続けることができなければなりません。

4

2 に答える 2

4

これがあなたが望むものです:

#include <stdio.h>
#include <stdarg.h>

void console(const char *_sFormat, ...);

int main () {
    console("Hello World!");
    return 0;
}

void console(const char *_sFormat, ...) {
    va_list ap;
    va_start(ap, _sFormat);
    printf("[APP] ");
    vprintf(_sFormat, ap);
    printf("\n");
    va_end(ap);
}
于 2010-02-05T11:36:08.260 に答える
2

別の問題が発生します(gfで示されます)-おそらく文字列printf_sFormatパラメーターを連結する必要があります-printf再帰的ではないかと思います-したがって、最初のパラメーターのフォーマットステートメントは読み取られません!

したがって、おそらくそのような解決策はより良いでしょう:

#include <stdarg.h>

void console(const char *_sFormat, ...)
{
  char buffer[256];

  va_list args;
  va_start (args, _sFormat);
  vsprintf (buffer,_sFormat, args);
  va_end (args);

  printf("[APP] %s\n", buffer);
}

使用されるタイプ/機能:

于 2010-02-05T11:23:09.590 に答える