可變參列表

2021-08-05 23:08:58 字數 1145 閱讀 4302

在可變引數列表中,我們在沒有對應的引數表示符時,如何獲取引數列表,在可變引數列表中我們,只有"...",所以通過標示符得到是不可能的,於是我們只好尋找另一種方式去獲取,我們知道函式在呼叫時都會返回位址,引數,等壓入到分配的棧空間中。引數的入棧順序會取決於你的呼叫約定,如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 和乙個型別 ...