<开始>
如果您没有接触过头文件
头文件:
头文件
可变参数函数的定义格式:
某些函数允许在其基本参数后面加上可变的参数列表,例如标准C中的printf函数:
int age = 10;
printf(“I am %d years old!”, age);
这种函数的定义格式应该是,其中regular_para可以为多个。
return_type function_name(regular_para, …);
要访问附加参数需要用va_list, va_start, va_arg和va_end等宏定义,具体用法如下:
- 用va_list定义一个附加参数列表头指针,在函数开始时定义一个变量va_list_ptr(变量名可随便起,将被va_start,va_end作为第一个参数);
2.用va_start制定从哪个参数之后取得可变参数列表,va_start;(va_list_ptr,regular_para);
3.va_arg将获取下一个参数,由此逐个处理参数;
3.在函数返回之前调用va_end(va_list_ptr).
自定一个Max_函数,获取参数中的最大值:
1: #include <cstdio>
2: #include <cstdarg>
3:
4: int Max_(int amount,...)
5: {
6: int max_int,temp_int;
7: va_list va_list_ptr;
8: va_start(va_list_ptr,amount);
9:
10: max_int = va_arg(va_list_ptr,int);
11:
12: for(int i = 1; i < amount; i++)
13: {
14: temp_int = va_arg(va_list_ptr,int);
15: max_int = (max_int > temp_int)?max_int:temp_int;
16: }
17: va_end(va_list_ptr);
18: return max_int;
19: }
20:
21: int main(int argc, char **argv) {
22: int m;
23: m = Max_(10,523,432,54,7654,232,1321,432,89543,432423,5433);
24: printf("The greatest one is: %d\n",m);
25: return 0;
26: }
扩展讨论:
- va_list作为一种类型,可以被当做参数传递给别的函数。常见实例为打log,log文本的构建可以用printf_s完成,但是由于打log过程需要有别的交互等操作,通常打log都被封装为一个函数,例如ShowLog(char* log_msg, va_list va_list_ptr);
它的具体实现可能是:
1: void ShowLog(const char *msg, va_list va_list_ptr)
2: {
3: Receiver* rec = GetLogReceiver();
4: char msgbuffer[100];
5: printf_s(msgbuffer, 100, 99, msg, va_list_ptr);
6: SendMessageTo(rec, msgbuffer);
7: }
8:
- 如果有方法可以获得函数参数个数,Max_中可以不用amount,而是直接使用第一个用于比较的数,大家可以考虑。
<完结>
原文链接: https://www.cnblogs.com/yegoufromchongqing/archive/2013/01/17/2863971.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/75884
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!