0

我正在尝试了解 va_args 的工作原理,我想将 args 列表与我正在制作的这个函数内部的格式字符串合并。我现在这样做的方式只会导致乱码。有没有一种方法可以让我避免编写一些庞大的处理函数?

va_start( listPointer, msg );
#ifdef DEBUG
fprintf(stderr, msg, listPointer);
#endif
str = (char *)calloc(sizeof(MAX_LINE_SIZE), sizeof(char));
if(str == NULL){
    fprintf(stderr, "out of memory exception");
    return;
}
snprintf(str, MAX_LINE_SIZE, listPointer);
printf("testing: %s\n", str);
ret = write(logger, str, strlen(str));
if(ret == -1){
    fprintf(stderr, 
            "Could not write to file with error: %s\n", 
            strerror(errno));
    fprintf(stderr, "Cannot continue with error logging");
}
va_end( listPointer );
4

2 回答 2

3

使用vsprintfvsnprintf函数。它不是采用参数列表,而是采用 va_list 作为其参数。

你可以这样称呼它:

vsnprintf(str, MAX_LINE_SIZE, listPointer);
于 2013-07-24T00:40:42.833 回答
1

成对编写可变参数函数:

void ellipsis_function(const char *fmt, ...)
{
    va_list args;
    va_start(args, fmt);
    valist_function(fmt, args);
    va_end(args);
}

void valist_function(const char *fmt, va_list args)
{
    vfprintf(stderr, fmt, args);
}

第一个函数应该和我展示的非常接近;可能有额外的固定参数,可能还有要捕获的返回值,但除此之外它真的很简单。

第二个函数可以做任何你需要的事情,用vsnprintf()et al 等将数据格式化成字符串。

于 2013-07-24T00:44:19.110 回答