void TestPrint(char* format, ...)
{
va_list argList;
va_start(argList, format);
printf(format, argList);
va_end(argList);
}
int main()
{
TestPrint("Test print %s %d\n", "string", 55);
return 0;
}
私は取得する必要があります:
Test print string 55
実際、ガベージ出力が得られます。このコードの何が問題になっていますか?
代わりに vprintf()
を使用してください。
Printfの代わりに、この特定の目的のために作成されたvprintfを代わりに試すことをお勧めします。
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
void errmsg( const char* format, ... )
{
va_list arglist;
printf( "Error: " );
va_start( arglist, format );
vprintf( format, arglist );
va_end( arglist );
}
int main( void )
{
errmsg( "%s %d %s", "Failed", 100, "times" );
return EXIT_SUCCESS;
}
他の人がすでに指摘したように:この場合、代わりにvprintf
を使用する必要があります。
しかし、本当にprintf
をラップしたい場合、またはv...
バージョンを持たない関数をラップしたい場合は、非標準の__builtin_apply
機能を使用してGCCでそれを行うことができます。
int myfunction(char *fmt, ...)
{
void *arg = __builtin_apply_args();
void *ret = __builtin_apply((void*)printf, arg, 100);
__builtin_return(ret);
}
__builtin_apply
の最後の引数は最大です。引数の合計サイズ(バイト単位)。ここで十分な大きさの値を使用してください。
これは、printf()
の使用方法ではありません。 _va_lists
_を使用する場合は、代わりにvprintf()
を使用します。 こちら 参照を見てください。