C语言的变长参数 va_arg

来源:互联网 发布:Centos安装jdk 编辑:程序博客网 时间:2024/05/22 03:47
void simple_va_fun(int i, ...)
{
    va_list arg_ptr;
    char *s=NULL;

va_start(arg_ptr, i);
    s=va_arg(arg_ptr, char*);
    va_end(arg_ptr);
    printf("%d %s\n", i, s);
    return 0;
}

/* 这个函数用来格式化带参数的字符串*/
int vspf(char *fmt, ...)
{
    va_list argptr;
//声明一个转换参数的变量
    int cnt;
    va_start(argptr, fmt);
//初始化变量  
    cnt = vsnprintf(buffer,bufsize ,fmt, argptr);

//将带参数的字符串按照参数列表格式化到buffer中
    va_end(argptr);
//结束变量列表,和va_start成对使用  
    return(cnt);
int bar (int, const char *, int, ...);extern inline __attribute__((always_inline)) int
f2 (int y, ...)
{
  return bar (y, "", __builtin_va_arg_pack ());        /* { dg-error "invalid use of" } */
}

extern inline __attribute__((always_inline)) int
f3 (int y, ...)
{
  return bar (y, "", 5, __builtin_va_arg_pack ());
}

}

int
test (void)
{
  int a = f2 (5, "a", 6);
  a += f3 (6, "ab", 17LL);
  return a;
}

extern int __open_real(const char*, int, ...) __asm__(__USER_LABEL_PREFIX__ "open");
__BIONIC_FORTIFY_INLINEint open(const char* pathname, int flags, ...) {    if (__builtin_constant_p(flags)) {        if ((flags & O_CREAT) && __builtin_va_arg_pack_len() == 0) {            __creat_missing_mode();  // compile time error        }    }    if (__builtin_va_arg_pack_len() > 1) {        __creat_too_many_args();  // compile time error    }    if ((__builtin_va_arg_pack_len() == 0) && !__builtin_constant_p(flags)) {        return __open_2(pathname, flags);    }    return __open_real(pathname, flags, __builtin_va_arg_pack());}

        

11.31vprintf(格式化输出数据)

相关函数        printf,vfprintf,vsprintf

表头文件        #include<stdio.h>

#include<stdarg.h>

定义函数        intvprintf(const char *format,va_listap);

函数说明        vprintf()作用和printf()相同,参数format格式也相同。va_list为不定个数的参数列,用法及范例请参考附录C。

返回值                成功则返回实际输出的字符数,失败则返回-1,错误原因存于errno中。

范例                #include<stdio.h>

#include<stdarg.h>

intmy_printf(const char *format,……)

{

va_list ap;

intretval;

va_start(ap,format);

printf(“my_printf( ):”);

retval = vprintf(format,ap);

va_end(ap);

returnretval;

}

main()

{

inti = 150,j = -100;

doublek = 3.14159;

my_printf(“%d %f %x\n”,j,k,i);

my_printf(“%2d %*d\n”,i,2,i);

}

执行                my_printf() : -1003.14159 96

my_printf() : 150 150

 

 







0 0