c語言中如何實現可變引數

2021-07-03 06:56:27 字數 658 閱讀 7465

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 ...