c语言函数参数可以省略吗,c语言中的省略号
C函数参数中的省略号-waterday的博客-51CTO技术博客
c函数参数中的椭圆
2010-06-09 20:48:32
标签:C函数省略号参数休闲
原创作品允许转载。转载时请以超链接的形式注明原出处、作者信息及本声明。否则将追究法律责任。http://waterday.blog.51cto.com/1032892/329079
c允许你定义参数数量和类型不确定的函数。例如,C语言中的标准函数printf就使用了这种机制。当声明带有不确定参数的函数时,参数部分可以用省略号“…”代替。“…”告诉编译器在调用函数时不要检查参数类型是否与实参类型或参数个数相同。
例如:
void ConnectData(int i,)
在上面的代码中,编译器只检查第一个参数是否为整数,不检查其他参数。
对于参数可变的函数,需要特殊处理。首先需要参考stdarg.h头文件,然后使用va_list类型和va_start、va_arg、va _ end三个宏读取传入函数的参数值。
这些宏定义如下(在ANSI C中):
type va_arg( va_list arg_ptr,type);
void va _ end(va _ list arg _ ptr);
void va_start( va_list arg_ptr,prev _ param);
描述如下:
va_start
将arg_ptr设置为传递给函数的参数列表中的第一个可选参数。参数arg_ptr必须具有va_list类型。参数prev_param是必需参数的名称,紧接在参数列表中第一个可选参数之前。如果prev_param是用寄存器存储类声明的,则宏的行为是未定义的。第一次使用va_arg之前,必须使用va_start。
va _ start函数将参数arg_ptr设置为变量参数列表中的第一个参数。参数arg_ptr的类型必须是va_list。参数prev_param是变量参数列表之前的参数。(也就是说,在ANSI C中,如果一个函数有一个可变参数,那么在可变参数之前必须有一个明确定义的参数,否则无法调用函数va_start。比如函数int add(int i,)是合法的,而函数int add(.)是违法的。)】
虚拟参数
从arg_ptr给定的位置检索类型的值,并递增arg_ptr以指向列表中的下一个参数,使用类型的大小来确定下一个参数的开始位置。va_arg可以在函数中使用任意次,以从列表中检索参数。
va _ arg函数将返回arg_ptr指示的位置值,并将arg_ptr指向下一个参数]
va_end
检索完所有参数后,va_end将指针重置为空。
示例代码:
#包括cstdarg
#包括iostream
使用命名空间std
Add (int pre,)//求和函数
{
va _ list arg _ ptr
int sum=0;
int nArgValue
sum=pre
va_start(arg_ptr,pre);
做
{
nArgValue=va_arg(arg_ptr,int);
sum=nArgValue
}while(nArgValue!=0);//自定义结束条件是输入参数为0。
va _ end(arg _ ptr);
返回总和;
}
int main()
{
cout add(1,2,3,0)endl;//必须以0结尾,因为参数列表结束的判断条件是停止读取0。
返回0;
}
参考:MSDN
http://winganson . blog . 163 . com/blog/static/12628477201021443515742/
3358 hi . Baidu . com/kiro power/blog/item/633d 34d 36 b 3 FD 3a 9 c 9 a 9 c . html本文来自水日的博客,请将此来源保留在http://waterday.blog.51cto.com/1032892/329079.
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。