在我們編寫**中,有時需要我們自定義可變引數函式,像庫函式中有pirntf,ioctl都是可變引數函式,如果我們要實現自定義可變引數,一般要實現像int ioctl(int fd, unsigned long request, ...)這種功能的。下面講解如何實現ioctl這個型別函式
1.通過分析printf函式:
1)typedef char *va_list;
2)#define _intsizeof(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) //計算n占用大小
3)#define va_start(ap,v)( ap = (va_list)&v + _intsizeof(v) ) //獲取第乙個可變引數在棧位址(在棧中引數入參順序為從右至左,棧底為高位址,棧頂為底位址,&v+_intsizeof(v) ,這裡&v是最後乙個固定引數的起始位址,再加上其實際占用大小後,就得到了第乙個可變引數的起始記憶體位址。所以我們執行va_start (ap, v)以後,ap指向第乙個可變引數在的記憶體位址
4)#define va_arg(ap,t) ( *(t *)((ap += _intsizeof(t)) - _intsizeof(t)) )
/*這個巨集做了兩個事情,
①用使用者輸入的型別名對引數位址進行強制型別轉換,得到使用者所需要的值
5)#define va_end(ap) ( ap = (va_list)0 )
2.模板:
void myioctl(int select,...)
va_list args;
va_start(args, select);//將args賦值為第乙個可變引數位址
switch(select)
va_end(args);
return;
}int main()
疑問:很奇怪,我不用庫里自帶的va_start,va_args(即不用標頭檔案stdarg.h),而是自定義上面的,居然不行,不知道怎麼回事。
自定義引數 Python自定義函式引數
1.種類 1 位置引數 x就是位置引數 usr bin env python coding utf 8 def power x result x x print result 2 預設引數n就是預設引數 usr bin env python coding utf 8 def power x,n 1 ...
Python自定義函式的引數
python函式的引數根據型別特點分成四個 必選引數 預設引數 可變引數 關鍵字引數 定義示例 結果必選引數 普通引數,必傳 def power x s 1 while x 1 x 1 s x return s print power 5 24預設引數 給引數乙個預設值,可以不傳 預設引數必須指向不...
excel 自定義引數(text函式)
1.自定義格式引數 方式一 結構組成 碼分為四個部分,中間用 號分隔,具體如下 正數格式 負數格式 零格式 文字格式 方式二 特定條件 最多只有三個條件 大於條件值 小於條件值 等於條件值 文字 方式三 特定條件 條件值1 條件值2 同時不滿足條件值1,2 文字 這三種形式,但可以統一為一種形式,滿...