#define va_end ( list ) 可以看出,va_end ( list )实际上被定义为空,没有任何真实对应的代码,用于代码对称,与va_start对应;另外,它还可能发挥代码的"自注释"作用。所谓代码的"自注释",指的是代码能自己注释自己。
下面我们以具体的例子来说明以上三个宏的使用方法。
2、一个简单的例子
#include <stdarg.h> /* 函数名:max * 功能:返回n个整数中的最大值 * 参数:num:整数的个数 ...:num个输入的整数 * 返回值:求得的最大整数 */ int max ( int num, ... ) { int m = -0x7FFFFFFF; /* 32系统中最小的整数 */ 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; } /* 主函数调用max */ int main ( int argc, char* argv[] ) { int n = max ( 5, 5, 6 ,3 ,8 ,5); /* 求5个整数中的最大值 */ cout << n; return 0; } 函数max中首先定义了可变参数表指针ap,而后通过va_start ( ap, num )取得了参数表首地址(赋给了ap),其后的for循环则用来遍历可变参数表。这种遍历方式与我们在数据结构教材中经常看到的遍历方式是类似的。 函数max看起来简洁明了,但是实际上printf的实现却远比这复杂。max函数之所以看起来简单,是因为: