[C++]用不定参数的处理,举例实现打log
<开始>
如果您没有接触过头文件<stdarg.h>或<cstdarg>,本篇文章将能让你理解类似于printf之类的可变参数函数的实现机制。
头文件:
头文件<stdarg.h>、<stdarg>定义了一些宏,用于逐个访问函数中未知数目和类型的参数。
可变参数函数的定义格式:
某些函数允许在其基本参数后面加上可变的参数列表,例如标准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等宏定义,具体用法如下:
1. 用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: }
扩展讨论:
1. 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:
2. 如果有方法可以获得函数参数个数,Max_中可以不用amount,而是直接使用第一个用于比较的数,大家可以考虑。
<完结>