2012-11-23 107 views
1
/* va_arg example */ 
#include <stdio.h> 
#include <stdarg.h> 

void PrintLines (char* first, ...) 
{ 
    char* str; 
    va_list vl; 

    str=first; 

    va_start(vl,first); 

    do { 
    str=va_arg(vl,char*); 
    if 
    printf ("%s\n",str); 

    } while (str!=NULL); 

    va_end(vl); 
} 

int main() 
{ 
    PrintLines ("First","Second","Third","Fourth",NULL); 
    return 0; 
} 

我们可以调用PrintLines这样的PrintLines("First","Second","Third",6,NULL);函数,它的整数作为变量参数列表的一部分。如果是的话,请解释如何做到这一点?可变长度参数列表

+3

您将代码标记为'C++',但代码本身纯粹为'C'。这里的语言确实很重要,因为使用'C++'你最好使用可变参数模板。 – Lol4t0

+0

你可以但事情是你用char *类型调用va_arg,所以它会将6解释为指向字符(或字符串)的指针,当你用%s做printf时会给你一些问题。为什么不传递字符串文字“6”? –

+1

@ Lol4t0:在编写C++时,使用C中不存在的功能不是强制性的。感谢您不要删除C++标签。 –

回答

3

所以对于你的情况,你只是会做硬编码,如:

void PrintLines (char* first, ...) 
    ... 
    str1=va_arg(vl,char*); 
    str2=va_arg(vl,char*); 
    str3=va_arg(vl,char*); 
    int4=va_arg(vl,int); 

    va_end(vl); 
} 

但我认为这不是你想要什么:有时候你可能想在pos 4调用一个整数PrintLines,有时伴一个字符串。那么你必须告诉它在pos 4处是什么东西,因为这个不好的函数应该如何找出它112312123是一个整数还是一个字符串的地址? 所以你必须为这个函数提供一些类型信息,可能类似于在printf和friends中做的那样:第一个arg包含一个描述其余参数的字符串。也许像vsprintf会为你做一个完美的工作?

1

在C++中考虑variadic templates 11.我知道它可以做到这一点,但从未使用过。

+0

实际上它是:'auto v = {(bool)(std :: cout << args <<'\ n')...};' – Lol4t0