web-dev-qa-db-ja.com

va_listを他の関数に渡す

Cの他の関数に変数引数を渡そうとしましたが、同じ環境での異なる実行だけでなく、異なるランタイム環境でも一貫性のない結果が生成されます。

int main() 
{ 
    int result = myprintf("Something \n %d", 9); 
    return result;
}

int myprintf(const char *format, ...){
    printf("Something \n %d", 9); 
    printf("\n");
    va_list args;        
    va_start(args, format);    
    int result = printf(format,args);
    printf("\n");
    va_end(args);
    return result;
} 

そして、生成される結果は次のとおりです。

WWW.FIRMCODES.COM 
 9
WWW.FIRMCODES.COM 
 438656664

「438656664」の理由が見つかりませんでした。

9
Monk

可変個引数を可変個引数関数に渡すことはできません。代わりに、va_listを引数として取る関数を呼び出す必要があります。標準ライブラリは、va_listをとるprintfおよびscanfのバリアントを提供します。それらの名前には接頭辞vが付いています。

あなたの例は次のようになります:

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

int printfln(const char *format, ...)
{
    int result;
    va_list args;

    va_start(args, format);
    result = vprintf(format, args);
    printf("\n");
    va_end(args);

    return result;
}

int main()
{
    int result = printfln("Something \n %d", 9);

    printf("(%d)\n", result);

    return 0;
}

たとえば、画面に出力するために2つのv...関数とログファイルを呼び出す場合、いくつかの落とし穴があります。v...関数はva_listを使い果たす可能性があるため、渡す必要があります。コードが移植可能である必要がある場合は、呼び出しごとに新しいもの。

7
M Oehm