[C++]用不定参数的处理,举例实现打log

<开始>

如果您没有接触过头文件,本篇文章将能让你理解类似于printf之类的可变参数函数的实现机制。

头文件:

头文件定义了一些宏,用于逐个访问函数中未知数目和类型的参数。

可变参数函数的定义格式:

某些函数允许在其基本参数后面加上可变的参数列表,例如标准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:
  1. 如果有方法可以获得函数参数个数,Max_中可以不用amount,而是直接使用第一个用于比较的数,大家可以考虑。

<完结>
原文链接: https://www.cnblogs.com/yegoufromchongqing/archive/2013/01/17/2863971.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/75884

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午5:12
下一篇 2023年2月9日 下午5:12

相关推荐