在可變引數列表中,我們在沒有對應的引數表示符時,如何獲取引數列表,在可變引數列表中我們,只有"...",所以通過標示符得到是不可能的,於是我們只好尋找另一種方式去獲取,我們知道函式在呼叫時都會返回位址,引數,等壓入到分配的棧空間中。引數的入棧順序會取決於你的呼叫約定,如stdcall cd call fastcall等等,因此其實引數的順序是有順序的,va_start(va_list va,last)我們可以通過last引數的位址,從而訪問其他的引數.其實va_list 本質上只是char*型別
1)typedef char * va_list;_list
2)#define _intsizeof(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
3)#define va_start(ap,v) ( ap = (va_list)&v + _intsizeof(v) )
將最後乙個引數的位址加上可變引數對其便宜後賦值給ap,即可變引數的首位址
4)#define va_arg(ap,t) ( *(t *)((ap += _intsizeof(t)) - _intsizeof(t)) )
指向下乙個引數的位址
5)#define va_end(ap) ( ap = (va_list)0 )
#include #include #include void translate(va_list va,const char *cmd);
void myprintf(const char *cmd,...);
int main()
void myprintf(const char *cmd,...)
void translate(va_list va,const char* cmd)
else
break;
case 'f':
break;
case 's':
break;
default:
printf("%%");
} translate(va,cmd+2); }}
可變引數 函式 可變參列表 2) 實現小型日誌檔案
va list arg ptr 定義乙個指向個數可變的引數列表指標 va start arg ptr,argn 使引數列表指標arg ptr指向函式引數列表中的第乙個可選引數,說明 argn是位於第乙個可選引數之前的固定引數,或者說,最後乙個固定引數 之前的乙個引數 函式引數列表中引數在記憶體中的順...
可變參函式
int add int x,int main int add int x,int sum 0 char point char x for int i 0 iint add int x,可變參函式原型,該函式中帶有識別符號的引數 x記錄的是引數的個數,後面的數字是需要求和的數。x的作用是為了標誌出加數...
可變參函式
採用c語言程式設計的時候,函式中形式引數的數目通常是確定的,在呼叫時要依次給出與形式引數對應的所有實際引數。但在某些情況下希望函式的引數個數可以根據需要確定。例如 printf const char format,c語言可變引數通過三個巨集 va start va end va arg 和乙個型別 ...