关于C#:使用va_list调用printf

call printf using va_list

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void TestPrint(char* format, ...)
{
    va_list argList;

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


int main()
{
    TestPrint("Test print %s %d
"
,"string", 55);
    return 0;
}

我需要得到:

1
Test print string 55

实际上,我得到了垃圾输出。 该代码有什么问题?


请使用vprintf()


我建议您尝试使用vprintf而不是printf,它是为此特定目的而创建的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#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...版本的函数,则可以在GCC中使用非标准的__builtin_apply功能来实现:

1
2
3
4
5
6
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()。 看这里供参考。