[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,而是直接使用第一个用于比较的数,大家可以考虑。

<完结>

posted on 2013-01-17 10:14  _小球儿_  阅读(2508)  评论(0编辑  收藏  举报

导航