C語言函式可變引數

2021-05-27 12:59:40 字數 1278 閱讀 2574

翻apue的時候,看到了一組可變引數的巨集就是va_list

類似**

void print_arg(int count,...)

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) )

這個巨集比較難理解 & ~(sizeof(int) - 1) 是將乙個數作為sizeof(int)的倍數,例如sizeof(int)=4, 則表示式為&11111100

sizeof(n)+sizeof(int)-1,保證sizeof(n)在變為4的倍數的時候,只變大不變小,例如sizeof(n)=5,最終表示式的結果為8

3)va_start巨集,獲取可變引數列表的第乙個引數的位址(ap是型別為va_list的指標,v是可變引數最左邊的引數):

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

4)va_arg巨集,獲取可變引數的當前引數,返回指定型別並將指標指向下一引數(t引數描述了當前引數的型別):

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

這個我也廢了好大勁才理解,這裡面有個結果,乙個是指標ap指向下乙個引數,乙個返回當前引數

ap+=_intsizeof(t);

return          *    這裡返回的是當前ap指標指向的值,但是ap已經指向下一引數了,說的比較拗口

5)va_end巨集,清空va_list可變引數列表:

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

此時int main()

返回結果就是abc

思考:1、sizeof(int)的加入說是為了滿足需要記憶體對齊的系統,那麼傳入char*,byte這種引數的在不對齊的系統下出錯了吧,引數傳遞靠壓棧操作,不對齊的系統是哪種

2、這裡面函式的型別檢查也不嚴格,不同函式型別的實現也得自己寫。有模仿c++的多型的意思,但總有點不自然的感覺。

3、c裡面還有沒有更好些的辦法,以後見到想到了再補充。

C語言可變引數函式

今天在c和指標書中第一次接觸到這個函式,以前有碰到過這樣可變引數的問題,但無從下手。原來c語言還是有這樣的功能,感覺c真是無所不能。c函式要在程式中用到以下這些巨集 void va start va list arg ptr,prev param type va arg va list arg pt...

C語言 可變引數函式

可變引數函式,即引數個數可變的函式。返回值 函式名 固定引數m個,可變引數n個 其中,m 1,n 0,即 至少需要乙個固定引數,否則你怎麼定位到引數呢?固定引數的宣告與普通函式引數相同 可選引數由於數目不定 0個或以上 宣告時用 表示 用作引數佔位符 固定引數和可選引數共同構成可變引數函式的引數列表...

C語言可變引數函式探秘

c語言的可變引數函式看起來是不很酷,必須printf之類的,初學時,一頭霧水,不禁感覺到宇宙的浩瀚和自己的渺小啊,但是等你知道其中原理之後,也就淡定了 下面首先看乙個程式 include stdarg.h include double addmanynum int n,va end arglist ...