《c和指標》 巨集可變引數

2021-05-26 07:28:16 字數 1576 閱讀 2390

va_list 是在c語言中解決變參問題的一組巨集,定義在標頭檔案下。

va_list的用法: 

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

(2)然後用va_start巨集初始化變數剛定義的va_list變數,這個巨集的第二個引數是第乙個可變引數的前乙個引數,是乙個固定的引數。

(3)然後用va_arg返回可變的引數,va_arg的第二個引數是你要返回的引數的型別。

(4)最後用va_end巨集結束可變引數的獲取。然後你就可以在函式裡使用第二個引數了。如果函式有多個可變引數的,依次呼叫va_arg獲取各個引數。

#include#include void arg_cnt(int cnt, ...)

va_end(arg_ptr);

}int main(void)

執行上面的程式:

value1=1

value2=2

value3=3

value4=4

value5=5

你發現這個程式有什麼不方便的地方了嗎?

對!就是要在第乙個引數指定可變引數的數量,就是arg_cnt函式中的cnt變數,

如果我在main中呼叫

arg_cnt(6,1,2,3,4,5);

那麼結果就是沒法**了。

下面再介紹乙個vsnprint函式,該函式支援可變引數,說明如下:

標頭檔案:

#include

函式宣告:

int vsnprintf(char *buffer, size_t max_count, const char *format, va_list varglist);

引數說明:

char *buffer [out],把生成的格式化的字串存放在這裡.

size_t max_count [in], buffer可接受的最大位元組數,防止產生陣列越界.

const char *format [in], 格式化字串

va_list varglist [in], va_list變數. va:variable-argument:可變引數

用法類似於vsprintf,只不過加了max_count的限制.

返回值說明:

如果成功呼叫此函式,返回寫到buffer中的字元的個數(不包括結尾的'\0')。snprintf和vsnprintf函式不能夠寫多於size大小(包括結尾的'0')的位元組數。如果輸出因為以上原因被截斷,返回成功寫入buffer的字元數(不包括結尾的'\0'),如果有足夠的記憶體空間的話。所以,如果返回值等於size或者大於size,表示輸出到buffer的字元被截斷,如果輸出過程中遇到錯誤,則返回乙個負數。

#include#include #define bufsize 80

char buffer[bufsize];

int vspf(char *fmt, ...)

int main(void)

執行結果如下:

30 90.000000 abc

cnt=16

C可變引數 printf(巨集處理可變引數)

x86平台下的巨集定義 typedef char va list 記憶體對齊 與sizeof int 對齊 0 sizeof n 4,intsizeof n 4 4 sizeof n 8,intsizeof n 8 define intsizeof n sizeof n sizeof int 1 s...

C語言可變引數巨集

歲月不饒人,這年紀大了記憶力真是差了很多。今天寫程式需要用到可變引數的巨集,可是忘了怎麼寫,這倒也沒什麼,因為我一向是不記憶這些語法細節的,反正我知道程式裡有個地方用到了這種技巧,但是可悲的是我忘了在哪個地方。搜尋?語法都忘了蒐個p呀。只好憑著印象,在自己負責的模組 中找了一圈,花了十幾分鐘才終於在...

C 可變引數的巨集

可變引數的巨集 1.可變引數的巨集是c99規範開始支援的,具體用法如下 define debug printf va args 預設號代表乙個可以變化的參數列。使用保留名 va args 把引數傳遞給巨集。當巨集的呼叫展開時,實際的引數就傳遞給 printf 了。如果預設號之前有逗號,就要寫成下面的...