1,最近剛剛知道c語言還有不定引數這麼個東東。
2,解決方法:
三個巨集的使用va_arg()、va_start()和va_end()
上述的巨集原型如下所示:
type va_arg(va_list argptr, type);
void va_end(va_list argptr);
void va_start(va_list argptr, last_parm);
它們都包含在標頭檔案中。
在vc++6.0中,這幾個巨集的定義:
#define _intsizeof(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1)) //型別n的大小
#define va_start(ap,v) ( ap = (va_list)&v + _intsizeof(v) ) //ap指向第乙個不定引數位址
#define va_arg(ap,t) ( *(t *)((ap += _intsizeof(t)) - _intsizeof(t)) ) //下乙個引數位址 返回當前ap指向的值,並且增加ap
#define va_end(ap) ( ap = (va_list)0 ) // 將指標置為無效
總結:讀取可變引數的過程其實就是堆疊中,使用指標,遍歷堆疊段中的引數列表,從低位址到高位址乙個乙個地把引數內容讀出來的過程.
3,不定引數函式有個限制,就是不定引數的列表必須在整個函式的引數列表的最後。
我們不可以定義如下的函式:
void func(int a, ……, int c)
所有型別固定的引數都必須出現在引數列表的開始。
在設計具有不定引數列表的函式的時候,我們有兩種方法來確定到底多少引數會被傳遞進來。
方法1是在型別固定的引數中指明後面有多少個引數以及他們的型別。printf就是採用的這種方法,它的format引數指明後面每個引數的型別。
方法2是指定乙個結束引數。這種情況一般是不定引數擁有同樣的型別,我們可以指定乙個特定的值來表示引數列表結束。
4,例項**:
#include
#include
#include
int sumi(int c, ...)
va_end(argptr);
return sum;
}double sum_series(int num, ...)
va_end(argptr);
return sum;
}int main()
c語言中的不定引數
在採用c語言程式設計時,函式中的形式引數數目通常是確定的,在呼叫的時候要依次給出與形式引數對應的所有實際引數,但在某些情況下希望函式的引數個數可以根據需要確定,如printf,scanf函式等,c編譯器提供了一系列處理這種情況的巨集,以遮蔽不同的硬體平台造成的差異,增加程式的可移植性,這些巨集包括v...
c語言中處理不定引數
c語言中處理不定引數數目 在程序中,堆疊位址是從高到低分配的.當執行乙個函式的時候,將引數列表入棧,壓入堆疊的高位址部分,然後入棧函式的返回位址,接著入棧函式的執行 這個入棧過程,堆疊位址不斷遞減,一些黑客就是在堆疊中修改函式返回位址,執行自己的 來達到執行自己插入的 段的目的.在函式呼叫時,第乙個...
C語言中不定引數個數的函式
c 中有函式過載這種方法,以供我們呼叫時要可以不確定實參的個數,其實c語言也可以,而且更高明!我們在stdio.h中可以看到printf 函式的原型 int printf char format,事實上,我們如果要寫這樣的函式也可以類似的寫,那麼在定義函式時用上這個符號 它叫佔位符,喊它 三個點 也...