将va_list传递给其他函数

时间:2016-04-27 06:04:27

标签: c variadic-functions

我一直在尝试将变量参数传递给C中的其他函数,但它在不同的运行时环境中以及在同一环境中的不同运行中产生不一致的结果:

int main() 
{ 
    int result = myprintf("Something \n %d", 9); 
    return result;
}

int myprintf(const char *format, ...){
    printf("Something \n %d", 9); 
    printf("\n");
    va_list args;        
    va_start(args, format);    
    int result = printf(format,args);
    printf("\n");
    va_end(args);
    return result;
} 

产生的结果是:

WWW.FIRMCODES.COM 
 9
WWW.FIRMCODES.COM 
 438656664

我找不到“438656664”的原因。

1 个答案:

答案 0 :(得分:6)

您无法将可变参数传递给可变参数函数。相反,您必须调用一个以va_list为参数的函数。标准库提供了printfscanf的变体,它们采用va_list;他们的名字有前缀v

您的示例应如下所示:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdarg.h>

int printfln(const char *format, ...)
{
    int result;
    va_list args;

    va_start(args, format);
    result = vprintf(format, args);
    printf("\n");
    va_end(args);

    return result;
}

int main()
{
    int result = printfln("Something \n %d", 9);

    printf("(%d)\n", result);

    return 0;
}

有一些问题,例如当你想调用两个v...函数来打印到屏幕和一个日志文件时:v...函数可能耗尽va_list,所以你如果您的代码应该是可移植的,则必须为每次调用传递一个新内容。