热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C/C++中自定义信息输出——printf与宏的配合使用

nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd

在C/C++中,提起“宏”多少有些皱眉,至少我在入门C++时旁人好心提醒:尽可能地使用typedef与const常量定义来替代“宏”的使用:
 
1. 类型宏定义

  #define HANLE void*
 //可以替换为:
 typedef void *HANLE;

2. 常量定义

  #define MAX_LIMIT 4096
 //可以替换为:
 const int s_MAX_LIMIT 4096;

因为宏定义是在预编译阶段,对内容进行直接替换,因此无法提供安全的类型检查等功能。

但我本次要说的是,宏的一个很炫的应用:

配合printf函数能够方便地自定义输出格式和内容。

举例来说吧,就是用户在程序中调用:

USER_PRINT( "i should checkout: v_a value is %d.\n", value_a );

能够输出类似信息

[2013-10-01 15:18:28][Fox Test][PID:2486]i should checkout: v_a value is 10.

当然,如果你用过linux下的syslog,你会发现这条输出信息算是“高仿”了。syslog可是linux下调试/监控的优秀组件,简单易用不说,功能也比较完备!

扯远了,本次的目标就是如何在用户简单输出一条信息的时候,我们能够同时加上各种附加信息,包括时间/用户/PID等参数,方便我们的调试/监控。

C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码 2014-05/101227.htm

读C++ Primer 之构造函数陷阱 2011-08/40176.htm

读C++ Primer 之智能指针 2011-08/40177.htm

读C++ Primer 之句柄类 2011-08/40175.htm

C++11 获取系统时间库函数 time since epoch 2014-03/97446.htm

C++11中正则表达式测试 2012-08/69086.htm

1. 首先,提供一个有意思的宏,该宏也是该功能的核心

#define USER_PRINT_BASE( format, args... )  printf( format, ##args )

是不是看到args...有点儿蒙,以及##args又是闹哪样?

说明一下:

i: args...是一个参数,是C/C++中定义变参函数(参数不固定)的一种格式。至于举个变参函数的例子,printf/scanf什么的就是随处可见的例子。

ii: ##args是宏的一个特殊语法应用(和普通的##宏应用不同[TODO]),使得宏展开时可以去掉可能存在的多余的','。

举例:

当没有##时,USER_PRINT_BASE( "something debug" )在宏展开时会成为printf( "something debug", )多了一个逗号!

当然,如果你调用USER_PRINT_BASE( "something debug--%d", 10 )的时候,即使没有'##'也不会出错。

iii: 如果你的编译器支持C99规范,那么宏也可以改写为:

#define USER_PRINT_BASE( format, ... )   printf( format, ##__VA_ARGS__ )

嗯好吧,其实只是变参的书写格式发生了点变化。

注:ii与iii详细的可以参考“C/C++可变参数,“## __VA_ARGS__”宏的介绍和使用”,里面有很详细的介绍2014-06/102923.htm

更多详情见请继续阅读下一页的精彩内容: 2014-06/102922p2.htm


推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • PDF内容编辑的两种小方法,你知道怎么操作吗?
    本文介绍了两种PDF内容编辑的方法:迅捷PDF编辑器和Adobe Acrobat DC。使用迅捷PDF编辑器,用户可以通过选择需要更改的文字内容并设置字体形式、大小和颜色来编辑PDF文件。而使用Adobe Acrobat DC,则可以通过在软件中点击编辑来编辑PDF文件。PDF文件的编辑可以帮助办公人员进行文件内容的修改和定制。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了使用Python解析C语言结构体的方法,包括定义基本类型和结构体类型的字典,并提供了一个示例代码,展示了如何解析C语言结构体。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 本文讲述了作者从最初对软件工程的选择迷茫到逐渐喜欢并坚持学习的经历。作者在大学期间通过学习专业课和参与项目开发,不断挑战自己并取得成就感。虽然曾考虑过转专业和复读,但最终决定坚持学习软件工程,并为自己的未来努力奋斗。作者还提到了大学生活与自己最初的预期不同,但对此并没有太多抱怨。 ... [详细]
  • 说到C语言的语句块,真是一堆血泪史。第一大坑就是优先级。刚工作那会儿,C的书没看几本,自信满满的认为C语言都会了,拿出搞ACM培养的豪情壮志,代码倒是写得爽,却到处留 ... [详细]
author-avatar
臭小子
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有