导航:[首页]->[cpp]->[可变参数及其陷阱]

说到可变参数,最常见的就是printf系列。在可变参数中一个重要的问题就是如何知道我需要多少个参数

对于printf系列,通过前面一个模式字符串来描述,例如%d表示一个整形数字。

而fcntl则通过cmd来确定,例如当cmd为F_SETFD时,那么后面需要一个int,若为F_GETFD,则无需参数

下面这个例子更直接,通过第一个参数n指定参数个数,总之任何方法都行。

/* va_arg example */
#include <stdio.h>      /* printf */
#include <stdarg.h>     /* va_list, va_start, va_arg, va_end */

int FindMax (int n, ...)
{
	int i,val,largest;
	va_list vl;
	va_start(vl,n);
	largest=va_arg(vl,int);
	for (i=1;i<n;i++)
	{
		val=va_arg(vl,int);
		largest=(largest>val)?largest:val;
	}
	va_end(vl);
	return largest;
}

int main ()
{
	int m;
	m= FindMax (7,702,422,631,834,892,104,772);
	printf ("The largest value is: %d\n",m);
	return 0;
}

不过需要多少参数只是我们的期望,调用时实际输入了多少,却不得而知,例如上面的例子,我调用FindMax时,FindMax(7,1,2)也可以运行,但程序还是会老老实实的寻找7个可变参数,这有可能导致非法内存访问。

对于printf类似的函数,可以使用__attribute__((format加以检测。

#参考

  1. http://www.cplusplus.com/reference/cstdarg/va_arg/