使用va调用printf

void TestPrint(char* format, ...)
{
    va_list argList;

    va_start(argList, format);
    printf(format, argList);
    va_end(argList);
}


int main()
{
    TestPrint("Test print %s %dn", "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;
}

资料来源:http://www.qnx.com/developers/docs/6.5.0/index.jsp?topic=/com.qnx.doc.neutrino_lib_ref/v/vprintf.html


正如其他人已经指出的那样:在这种情况下,您应该使用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的最后一个参数是最大值。 参数的总大小(以字节为单位)。 确保你在这里使用足够大的值。

链接地址: http://www.djcxy.com/p/72147.html

上一篇: call printf using va

下一篇: Pointers to string in functions