C语言函数的参数传递总是固定了个数,那么有没有传递任意个数参数的方法呢?在C++中,函数重载提供了多种参数传递的解决办法,但也不是任意参数个数。事实上,C语言是提供任意数量参数的解决方案的。
printf(),scanf()等就是这样一类可支持任意参数个数变量的函数,以下是printf的用法示例。
3 | printf (“Hello my name is %s“, name); |
这是printf的函数原型: int printf(const char *fmt, …)
注意它的第二个参数,“…”三个点。这是可变参数函数的参数,它的数量是可变动的,它使用省略号来忽略之后的参数。在这里其实是做了一个占位符的作用。
那么,传进来了多个参数,如何去使用它呢。这里需要用到一个头文件stdarg.h,以下是要用到的宏。va在这里是variable-argument(可变参数)的意思。
1 | va_list 型的变量声明,比如 va_list arg_ptr; |
2 | void va_start ( va_list arg_ptr, prev_param ); |
4 | type va_arg ( va_list arg_ptr, type ); |
6 | void va_end ( va_list arg_ptr ); |
那么读取的做法显然是通过va_start定位起始位置,然后用va_arg一个个读取下来,最后用va_end将指针置为无效。
在函数的参数中,第一个参数的作用就是定位起始位置,如果是play(…)这样,我们就无法定位起始位置了,所以这个写法在C语言中是不能通过编译的,不过C++可以编译。
14 | printf ( "the %dth parameter is %dn" ,i,x); |
19 | int main( int argc, char * argv[]) |
转载请注明:旅途@KryptosX » C语言“…”占位符及可变参数函数