专栏中心

EEPW首页 > 专栏 > 可变参数实现log打印

可变参数实现log打印

发布人:电子禅石 时间:2020-08-27 来源:工程师 发布文章

实现步骤如下: 
    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个参数,显然第十次读取是多余的,多余的操作一般不会有什么好结果,当然如果实参过多,多余的实参也不会被读取而是被忽略。

专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词:

相关推荐

e络盟大幅扩充PUI Audio产品系列以强化音频产品组合

TVS管和稳压二极管的区别在哪里?

2025-02-18

意法半导体VIPower全桥电机驱动器配备实时诊断功能简化车规电驱系统设计,降低系统成本

基于P89LPC932A1的酒后驾车检测控制系统

视频 2009-11-16

ROHM开发出适用于便携式A4打印机的小型热敏打印头

肖特集团2024财年逆势笃行,在挑战中稳健拓新

新思科技全新升级业界领先的硬件辅助验证产品组合,助力下一代半导体与设计创新

智能新能源并网逆变器

视频 2009-11-16

基于LPC2387微控制器的移动远程家具监控与家电设备控制

视频 2009-11-16

Power Integrations发布最新版MotorXpert软件,支持无分流检测电路或传感器的FOC电机驱动设计

基于Zigbee思想的人体脉搏波监控网络

视频 2009-11-16

无愧地表最强AI!Grok 3“思维链 × DeepSearch”双刃剑来袭

西门子为台积电3DFabric技术提供经认证的自动化设计流程

大联大世平集团推出基于易冲半导体产品的MPP Qi2无线模组方案

步行机器人的设计与实现

视频 2009-11-16

ARM授权培训中心培训课程

ARM内核结构简介

更多 培训课堂
更多 焦点
更多 视频

技术专区