可变参数实现log打印
来源:互联网 发布:弱智保姆软件 编辑:程序博客网 时间:2024/06/06 18:14
实现步骤如下:
1. 函数原型中使用省略号;
2. 函数定义中创建一个va_list变量;
3. 初始化va_list变量;
4. 访问参数列表;
5. 完成清理工作;
1. 函数原型中,省略号必须在参数列表的末尾:也就是说,在函数原型中参数列表省略号的右边不能再出现确定参数;
2.运行时,函数必须能够根据已有信息(既有约定,或确定实参)确定可变参数的具体个数与类型:函数定义需要知道可变参数的具体类型、个数,这些信息是在运行时确定的,那么显然应该由实参来确定。
3. 使用完成时需要用va_end()做清理工作,可变参数宏可能使用了动态分配的内存,忘记执行清理操作有可能导致内存泄漏等问题;
4.可变参数宏只能实现顺序访问可变参数,无法后退访问,但是可以在清理操作完成后重新使用va_start初始化va_list变量,重新遍历形参表;
5.该方法是极不安全的,宏本身无法提供任何安全性保证,他总是按照既定代码“自作多情”的认为实参就应该是那么多,即使实参并不是那么多。这就要求所有安全性必须由程序员来保证。例如,在以上的示例代码中,如果调用时指定count为10,但实际上只给出9个可变形参,那么函数还是会读取10个参数,显然第十次读取是多余的,多余的操作一般不会有什么好结果,当然如果实参过多,多余的实参也不会被读取而是被忽略。
1. 函数原型中使用省略号;
2. 函数定义中创建一个va_list变量;
3. 初始化va_list变量;
4. 访问参数列表;
5. 完成清理工作;
上述步骤的实现需要使用到四个宏:va_list、va_start(va_list, arg)、va_arg(va_list, type)、va_end(va_list)这些宏在头文件stdarg.h中声明定义。因此使用时需要包含该头文件。
#include "stdafx.h"#include <stdarg.h>using namespace std;void trace_info(const char* file, const char* func, int line, const char* format, ...){fprintf(stdout, "[%s:%d]%s: ", file, line, func);va_list vaList;va_start(vaList, format);vfprintf(stdout, format, vaList);va_end(vaList);fprintf(stdout, "%c", '\n');}#define __TRACE_INFO__(...) trace_info(__FILE__, __FUNCTION__, __LINE__, __VA_ARGS__);int _tmain(int argc, _TCHAR* argv[]){__TRACE_INFO__("error code is %d", 1);__TRACE_INFO__("error code is %d", 2);return 0;}使用这种方法需要注意一下几点:
1. 函数原型中,省略号必须在参数列表的末尾:也就是说,在函数原型中参数列表省略号的右边不能再出现确定参数;
2.运行时,函数必须能够根据已有信息(既有约定,或确定实参)确定可变参数的具体个数与类型:函数定义需要知道可变参数的具体类型、个数,这些信息是在运行时确定的,那么显然应该由实参来确定。
3. 使用完成时需要用va_end()做清理工作,可变参数宏可能使用了动态分配的内存,忘记执行清理操作有可能导致内存泄漏等问题;
4.可变参数宏只能实现顺序访问可变参数,无法后退访问,但是可以在清理操作完成后重新使用va_start初始化va_list变量,重新遍历形参表;
5.该方法是极不安全的,宏本身无法提供任何安全性保证,他总是按照既定代码“自作多情”的认为实参就应该是那么多,即使实参并不是那么多。这就要求所有安全性必须由程序员来保证。例如,在以上的示例代码中,如果调用时指定count为10,但实际上只给出9个可变形参,那么函数还是会读取10个参数,显然第十次读取是多余的,多余的操作一般不会有什么好结果,当然如果实参过多,多余的实参也不会被读取而是被忽略。
阅读全文
0 0
- 可变参数实现log打印
- vsnprintf打印可变参数的log
- 利用可变模板参数实现log功能
- C中可变参数宏实现调试打印
- c++11使用可变参数实现日志打印
- __android_log_vprint可变参数打印日志
- 可变参数函数实现
- 可变参数函数实现
- 可变参数的实现
- 可变参数的实现
- 可变参数实现分析
- printf可变参数实现
- 可变常参数实现
- 可变参数的实现
- php可变参数实现
- Java 可变参数实现
- 可变参数的实现
- 使用可变参数的方法记录log
- 关于centOS 7的服务启动,端口查询,防火墙管理
- typedef struct和struct的区别
- Linux入门学习之vi/vim编辑器
- rpm包管理_yum在线管理
- 理解mysql_事务的隔离级别
- 可变参数实现log打印
- Linux 源码安装
- HTML 5 Canvas
- vim基础命令
- 一些运维试题
- 用Apache Spark做大数据处理——第四部分:Spark MLlib机器学习库(英文版)
- 28个经典面试题
- 学习笔记-极光推送使用心得
- 如何更改CentOS7的启动级别