如何自定義可變引數函式

2021-07-30 14:02:03 字數 1024 閱讀 1363

在我們編寫**中,有時需要我們自定義可變引數函式,像庫函式中有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 文字 這三種形式,但可以統一為一種形式,滿...