c函式va list可變引數原理

2021-07-08 15:33:07 字數 1368 閱讀 5696

#ifdef _m_alpha

typedef struct va_list;

#else

typedef char * va_list;

#endif

_m_alpha

是指dec alpha

(alpha axp

)架構。所以一般情況下

va_list

所定義變數為字元指標。

需要用到的巨集有:

intsizeof

巨集,獲取型別占用的空間長度,最小占用長度為

int的整數倍:

#define _intsizeof(n) ( (sizeof(n) +sizeof(int) - 1) & ~(sizeof(int) - 1) )

va_start

巨集,獲取可變引數列表的第乙個引數的位址(

ap是型別為

va_list

的指標,

v是可變引數最左邊的引數):

#define va_start(ap,v) ( ap = (va_list)&v+ _intsizeof(v) )

va_arg

巨集,獲取可變引數的當前引數,返回指定型別並將指標指向下一引數(

t引數描述了當前引數的型別):

#define va_arg(ap,t) ( *(t *)((ap +=_intsizeof(t)) - _intsizeof(t)) )

va_end

巨集,清空

va_list

可變引數列表:

#define va_end(ap) ( ap = (va_list)0 )

例如void  func   ( int  m,  int  n ,  int i ,  …)

va_list是c語言中的可變引數列表巨集,實質上是通過找到可變引數在棧中的位址,並按位址取出改位址中的值得過程。

呼叫該函式的(記憶體)過程,例如func( 1 , 2 , 3, 4 )。

1.      首先va_list是乙個指向引數的乙個指標,然後通過va_start對該指標進行初始化,函式func中就是將該指標指向引數4的位址;

將va_list

指標置為

null

va list可變引數的函式

include include include include include char vstrcat const char first,len strlen first va start argp,first while p va arg argp,char t 0 va end argp re...

va list 可變引數

什麼是變長引數?所謂含有變長引數的函式是指該函式可以接受可變數目的形參。例如我們都非常熟悉的 printf,scanf等等。2 變長引數如何實現?首先來看下面這樣乙個例子 include include include void demo char msg,else break para va ar...

C 遍歷可變引數 va list

前言 在c 中使用可變引數可沒c 中那麼方便,使用起來也很麻煩,想盡辦法搜了很多資料仍然無果,但是確有一些心得。文章 1.2.va list va start va arg va end的原理與使用 正文 一.遍歷可變引數 1.1 傳入的時候指定引數個數 void arg cnt intcnt,va...