c語言函式庫中有不少類似於printf,scanf的函式,這些函式接收的引數個數是不確定的。這些函式實際是通過檔案中的va_list,va_start,va_arg,va_end巨集定義是實現的。另外,我們知道程式執行時的記憶體結構後,也可以通過直接訪問這些記憶體空間獲得實際引數值(事實上stdarg.h檔案中的相關巨集定義就是這麼操作的)。
#include #include #include int sum1(int nums);
int sum2(int nums);
int main()
//棧是從高位址到低位址生長的,c語言中函式引數是從右向左依次入棧的
//c語言中入棧出棧是由函式呼叫者決定的(_ccall)
//c++中入棧出棧是由函式本身負責的(_stdcall),c++中也支援可變引數,
//但需要需要宣告為int sum1(int nums,...)形式
int sum1(int nums)
//利用中的va_list,va_start,va_end,va_arg巨集定義實現
int sum2(int nums)
程式執行結果如下
實現c語言中的可變引數函式
c語言程式設計中有時會遇到一些引數個數可變的函式,例如printf 函式,其函式原型為 int printf const char format,它除了有乙個引數format固定以外,後面跟的引數的個數和型別是可變的 用三個點 做引數佔位符 實際呼叫時可以有以下的形式 printf d i prin...
C語言中可變引數函式的實現
c語言的可變引數函式的實現需要使用標頭檔案stdarg.h,在該標頭檔案中定義了乙個變數型別va list和三個巨集va start va arg va end 下面將在 中講解這幾個巨集的使用方法。第一種方法是在函式內部手動指定可變引數的型別。首先需要知道可變引數的個數,並作為第乙個引數傳入。由於...
C語言中可變引數函式實現原理
c函式呼叫的棧結構 可變引數函式的實現與函式呼叫的棧結構密切相關,正常情況下c的函式引數入棧規則為 stdcall,它是從右到左的,即函式中的最右邊的引數最先入棧。例如,對於函式 void fun int a,int b,int c 其棧結構為 0x1ffc d 0x2000 a 0x2004 b ...