0

私はva_argsがどのように機能するかを学ぼうとしています.argsのリストをこの関数内のフォーマット文字列とマージしたいと思っています. 今やっているやり方はただのジベリッシュになるだけです。大規模な処理関数を作成する必要がないようにする方法はありますか?

va_start( listPointer, msg );
#ifdef DEBUG
fprintf(stderr, msg, listPointer);
#endif
str = (char *)calloc(sizeof(MAX_LINE_SIZE), sizeof(char));
if(str == NULL){
    fprintf(stderr, "out of memory exception");
    return;
}
snprintf(str, MAX_LINE_SIZE, listPointer);
printf("testing: %s\n", str);
ret = write(logger, str, strlen(str));
if(ret == -1){
    fprintf(stderr, 
            "Could not write to file with error: %s\n", 
            strerror(errno));
    fprintf(stderr, "Cannot continue with error logging");
}
va_end( listPointer );
4

2 に答える 2

3

vsprintfまたはvsnprintf関数を使用します。パラメータのリストを取得するのではなく、そのパラメータの va_list を取得します。

次のように呼び出します。

vsnprintf(str, MAX_LINE_SIZE, listPointer);
于 2013-07-24T00:40:42.833 に答える
1

可変引数関数をペアで書く:

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

void valist_function(const char *fmt, va_list args)
{
    vfprintf(stderr, fmt, args);
}

最初の関数は、私が示したものに非常に近いはずです。余分な固定引数があり、キャプチャする戻り値があるかもしれませんが、それ以外は本当に単純です。

vsnprintf()2 番目の関数は、 et al を使用してデータを文字列にフォーマットするなど、必要なことは何でも実行できます。

于 2013-07-24T00:44:19.110 に答える