#define va_end ( list ) 可以看出,va_end ( list )實(shí)際上被定義為空,沒(méi)有任何真實(shí)對(duì)應(yīng)的代碼,用于代碼對(duì)稱,與va_start對(duì)應(yīng);另外,它還可能發(fā)揮代碼的"自注釋"作用。所謂代碼的"自注釋",指的是代碼能自己注釋自己。
下面我們以具體的例子來(lái)說(shuō)明以上三個(gè)宏的使用方法。
2、一個(gè)簡(jiǎn)單的例子
#include <stdarg.h> /* 函數(shù)名:max * 功能:返回n個(gè)整數(shù)中的最大值 * 參數(shù):num:整數(shù)的個(gè)數(shù) ...:num個(gè)輸入的整數(shù) * 返回值:求得的最大整數(shù) */ int max ( int num, ... ) { int m = -0x7FFFFFFF; /* 32系統(tǒng)中最小的整數(shù) */ va_list ap; va_start ( ap, num ); for ( int i= 0; i< num; i++ ) { int t = va_arg (ap, int); if ( t > m ) { m = t; } } va_end (ap); return m; } /* 主函數(shù)調(diào)用max */ int main ( int argc, char* argv[] ) { int n = max ( 5, 5, 6 ,3 ,8 ,5); /* 求5個(gè)整數(shù)中的最大值 */ cout << n; return 0; } 函數(shù)max中首先定義了可變參數(shù)表指針ap,而后通過(guò)va_start ( ap, num )取得了參數(shù)表首地址(賦給了ap),其后的for循環(huán)則用來(lái)遍歷可變參數(shù)表。這種遍歷方式與我們?cè)跀?shù)據(jù)結(jié)構(gòu)教材中經(jīng)??吹降谋闅v方式是類似的。 函數(shù)max看起來(lái)簡(jiǎn)潔明了,但是實(shí)際上printf的實(shí)現(xiàn)卻遠(yuǎn)比這復(fù)雜。max函數(shù)之所以看起來(lái)簡(jiǎn)單,是因?yàn)椋?br /> (1) max函數(shù)可變參數(shù)表的長(zhǎng)度是已知的,通過(guò)num參數(shù)傳入;
第12~13行非常要害,對(duì)應(yīng)著va_start ( ap, num ),這兩行將第一個(gè)可變參數(shù)的地址賦值給了指針ap。另外,從第12行可以看出num的地址為ebp+0Ch;從第13行可以看出ap被分配在函數(shù)內(nèi)部局部棧底減4的位置上(占用4個(gè)字節(jié))。