2012-11-23 220 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