本文最后更新于:2019年10月12日 下午
一般写的C语言函数,传入的参数都是固定的,但是有时候再开发的过程中不能确定参数的准确个数,这个时候就需要可变参数了
第一个简单的例子,演示了C语言传入可变参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #include <iostream>
using namespace std;
void test(int num, ...) { cout << "传入了" << num << "个参数:" << endl; for(int i = 1; i <= num; i++) { cout << *(&num + i) << endl; } }
int main() { test(5, 1, 2, 3, 4, 5); return 0; }
|
C语言提供了一个宏,能更好的处理传入的参数
stdarg宏:可变参数列表是通过宏来实现的,这些宏定义与stdarg.h头文件,它是标准库的一部分。
这个头文件包含了一个申明类型 va_list 和三个宏:va_start,va_arg,va_end。
我们可以申明一个类型为va_list的变量,与这几个宏配合使用,访问参数的值。
第二个例子,用C语言的可变参数来写一个求n个数最大值的函数max
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| #include <iostream> #include <stdarg.h>
using namespace std;
int max(int n, ...) { va_list args; va_start(args, n); int maximum = -0x7FFFFFFF; int tmp; for(int i = 0; i < n; i++) { tmp = va_arg(args, int); if(maximum < tmp) { maximum = tmp; } } va_end(args); return maximum; }
int main() { cout << max(3, 1, 3, 123) << endl; cout << max(4, 1, 3, 124, 32) << endl; return 0; }
|
第三个例子,自己实现一下printf这个函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| #include <stdio.h> #include <Windows.h> #include <assert.h>
void my_printf(char *str,...) { int i = 0; int x = 0; char *pstr = NULL; va_list arg; va_start(arg,str); assert(str); while (*str) { if(*str == '%') { str++; switch(*str) { case 's': pstr = va_arg(arg,char*); while(*pstr) { putchar(*pstr); pstr++; } break; case 'c': x = va_arg(arg,int); putchar(x); break; case 'd': x = va_arg(arg, int); printf("%d", x); break; default: putchar(*(str-1)); putchar(*str); break; } str++; } else { putchar(*str); str++; } } va_end(arg); } int main() { my_printf("%d %c %s\n",123,'t', "hello"); return 0; }
|