va list 原理以及用法

2021-08-21 02:43:59 字數 1208 閱讀 4767

va_list 是在c語言中解決變參問題的一組巨集

他有這麼幾個成員:

1) va_list型變數:

#ifdef  _m_alpha

typedef struct va_list;

#else

typedef char * va_list;

#endif

2)_intsizeof 巨集,獲取型別占用的空間長度,最小占用長度為int的整數倍:

#define _intsizeof(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
#define va_start(ap,v)  ( ap = (va_list)&v + _intsizeof(v) )
#define va_arg(ap,t)    ( *(t *)((ap += _intsizeof(t)) - _intsizeof(t)) )
5)va_end巨集,清空va_list可變引數列表:

#define va_end(ap)      ( ap = (va_list)0 )
va_list的用法:

(1)首先在函式裡定義一具va_list型的變數,這個變數是指向引數的指標;

(2)然後用va_start巨集初始化變數剛定義的va_list變數;

(3)然後用va_arg返回可變的引數,va_arg的第二個引數是你要返回的引數的型別(如果函式有多個可變引數的,依次呼叫va_arg獲取各個引數);

(4)最後用va_end巨集結束可變引數的獲取。

使用va_list應該注意的問題:

(1)可變引數的型別和個數完全由程式**控制,它並不能智慧型地識別不同引數的個數和型別;

(2)如果我們不需要一一詳解每個引數,只需要將可變列表拷貝至某個緩衝,可用vsprintf函式;

(3)因為編譯器對可變引數的函式的原型檢查不夠嚴格,對程式設計查錯不利.不利於我們寫出高質量的**;

小結:可變引數的函式原理其實很簡單,而va系列是以巨集定義來定義的,實現跟堆疊相關。我們寫乙個可變引數的c函式時,有利也有弊,所 以在不必要的場合,我們無需用到可變引數,如果在c++裡,我們應該利用c++多型性來實現可變引數的功能,盡量避免用c語言的方式來實現。

**:其它參考:

有關VA LIST的用法

va list 是在c語言中解決變參問題的一組巨集 va list的用法 1 首先在函式裡定義一具va list型的變數,這個變數是指向引數的指標 2 然後用va start巨集初始化變數剛定義的va list變數,這個巨集的第二個引數是第乙個可變引數的前乙個引數,是乙個固定的引數。3 然後用va ...

c函式va list可變引數原理

ifdef m alpha typedef struct va list else typedef char va list endif m alpha 是指dec alpha alpha axp 架構。所以一般情況下 va list 所定義變數為字元指標。需要用到的巨集有 intsizeof 巨集...

jmp用法以及原理分析

段內轉移和段間轉移 轉移指令 控制cpu執行記憶體中的某行 可以通過修改ip或者同時修改cs ip 只修改ip的稱為段內轉移 jmp ax 相當於 mov ax,ip jmp ax 同時修改cs ip的叫段間轉移 jmp 1000 0 這是debug語法,只能在debug中使用 段內轉移分為短轉移和...