C++中使用可变参数 (二)

2014-11-24 12:50:50 · 作者: · 浏览: 6
arg(argptr, int)) != GUARDNUMBER)

sum += i;

va_end(argptr);

return sum;

}

可以这样的调用: printf("%d\n", MySum(1, 3, 5, 7, 9, 0));

但不可以直接传入一个0: printf("%d\n", MySum(0)); //error

指定个数:

int MySum(int nCount, ...)

{

if (nCount <= 0)

return 0;

int sum = 0;

va_list argptr;

va_start(argptr, nCount);

for (int i = 0; i < nCount; i++)

sum += va_arg(argptr, int);

va_end(argptr);

return sum;

}

调用时第一个参数表示后面参数的个数如:

printf("%d\n", MySum(5, 1, 3, 5, 7, 9));

printf("%d\n", MySum(0));

代码所用的头文件:

#include

#include

可变参数的使用方法远远不止上述几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃。

可变参数的原形理涉及到调用函数时参数的入栈问题,这个下次再开一篇进行专门的探讨。

注1. 网上有不用vfprintf()自己解析参数来实现printf()的,但很少能将功能做到与printf()相近(实际上能完全熟悉printf()的人已经就不多,不信的话可以先看看《C陷阱与缺陷》了解printf()很多不太常用的参数,再去Microsoft Visual Studio\VC98\CRT\SRC中查看OUTPUT.C对printf()的实现)。

注2. 如果输出单个字符 putchar(ch)会比printf(“%c”, ch)效率高的多。在字符串不长的情况下,多次调用putchar()也会比调用printf(“%s\n”, szStr);的效率高。在函数大量调用时非常明显。