2015-09-08 133 views
-1
#include<stdio.h> 
#include<stdarg.h> 

int sum(int, ...); 

int main(void) 
{ 
    int answer = sum(4, 4, 3, 2, 1); 
    printf("합은 %d입니다.\n", answer); 

    return 0; 
} 

int sum(int num, ...) 
{ 
    int answer = 0; 
    va_list argptr; 

    va_start(argptr, num); 
    for (; num > 0; num--) 
     answer += va_arg(argptr, int); 

    va_end(argptr); 
    return(answer);  
} 

這是可變參數功能。我有一些疑問。可變參數功能

什麼是「stdarg.h」的問題?
而我從我的書中找不到關於 va_listva_end,va_start

+2

看到[C++中可變參數數量?](http://stackoverflow.com/q/1657883/1708801) –

+1

不同意「在C++中可變參數數量?」是一個很好的複製1)它被標記爲C++而不是C像這樣。 2)高度評價的答案會變成「變量函數」 – chux

+0

@chux同意了,我認爲這不是一個好的重複函數,我不認爲我已經看過這個問題的C版本。 –

回答

1

頭文件「stdarg.h」是一個標準的C頭文件,它聲明瞭一些宏用於處理具有不同類型參數的函數。宣佈的最重要的宏是va_list,va_start,va_endva_arg

va_list表示可以存儲函數調用的「未命名」參數(由「...」捕獲的參數)的抽象數據類型。要使用它,你必須先初始化它,使用va_start()宏:

va_list argptr; /* declaration of the unnamed arguments list */ 
va_start(argptr, num); /* the initialization of the list */ 

va_start()第二parametar必須是函數的最後一個命名參數(在你的情況,這是num,這是唯一的命名參數提供)。初始化後,您可以從argptr列表逐個提取的未命名的參數,使用va_arg()宏:

answer += va_arg(argptr, int); 

argptrva_arg()返回一個參數的每次調用,將其解釋爲int(或任何其他類型的作爲va_arg()的第二個參數提供)。注意,沒有類型檢查,也沒有辦法確定調用者實際提供了正確類型的參數。

最後,在返回之前,應該在最後通過調用va_end(argptr)來發布該列表。