C语言 使用va_list调用printf

yks3o0rb  于 2023-04-29  发布在  其他
关注(0)|答案(5)|浏览(122)
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

实际上,我得到的是垃圾输出。这段代码有什么问题?

mzsu5hc0

mzsu5hc02#

除了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;
}

Source

ajsxfq5m

ajsxfq5m3#

正如其他人已经指出的:在这种情况下,应该使用vprintf
但是如果你真的想 Package printf,或者想 Package 一个没有v...版本的函数,你可以在GCC中使用非标准的__builtin_apply特性来实现:

int myfunction(char *fmt, ...)
{
    void *arg = __builtin_apply_args();
    void *ret = __builtin_apply((void*)printf, arg, 100);
    __builtin_return(ret);
}

__builtin_apply的最后一个参数是max。以字节为单位的参数的总大小。请确保在这里使用足够大的值。

wbgh16ku

wbgh16ku4#

这不是你使用printf()的方式。如果您想使用va_lists,请使用vprintf()。查看here以获得参考。

p4tfgftt

p4tfgftt5#

对于任何人谁需要更普遍的解决方案-尝试这个模板函数:

template<typename... Args>
void myprintf(const char *format, Args... args)
{
    myObject.printf(format, args...);
}

相关问题