在呼叫函式時,如果我們希望函式的引數個數是可變的,那麼便需要用到變參函式,既在每次函式呼叫時輸入的引數個數不定。我們需要知道以下兩點:
1 函式形參入棧方向為自右向左
2 在乙個程序的記憶體空間中,棧低為高位址,棧頂為低位址。
所以我們可以從最後乙個入棧的引數(形參第乙個)根據位址以及棧空間的特點依次找到所有引數。
c語言**實現(不定參求和)
#include
#define first(p,sum,type) p=(void*)((char*)(&sum)+sizeof(type)) //跳過第乙個存放有多少個數求和的變數位址,讓p指向求和的第乙個數
#define secend(p,type) p=*(type*)p; p=(void*)((char*)p+sizeof(type)) //先取值 在跳向下乙個
int add(int sum,...) {
int ret=0;
void*p=null:
int i=0;
first(p,sum,int);
for(i=0;i
變參函式設計
變參函式的應用得比較少.輸出log資訊功能的函式演常會用到變參函式.什麼是變參函式?比如 printf 個數 d,總數 d a,b printf就是變參函式,因為其引數的個數不是固定的.變參函式一般用到下列巨集 va arg retrieve argument from list va end re...
變參函式剖析
變參函式定義形式如func type a,要求至少乙個固定引數,因為需要通過這個引數來確定究竟有多少個引數 以及引數的型別。windows中,變參函式用來獲取引數的幾個巨集定義如下。typedef char va list define addressof v v define intsizeof ...
變參函式實現細節
c語言的函式雖然不具備c 的多型性,但也可以接受引數不確定的情況,當然,c語言中的變參函式實際在功能上是受限的,廢話不多講,下面來看看變參函式的邊邊角角的問題。討論之前我們來看一下最熟悉的變參函式printf的原型宣告 int printf const char format,注意到,在函式中宣告其...