在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等参数,方便我们的调试/监控。

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__”宏的介绍和使用”,里面有很详细的介绍

vc2017 linux printf,C/C++中自定义信息输出——printf与宏的配合使用相关推荐

  1. Qt 中的信息输出机制:QDebug、QInfo、QWarning、QCritical 的简单介绍和用法

    Qt 中的信息输出机制 介绍 QDebug 在 Qt 中使用 qDebug 输出不同类型的信息 浮点数:使用 %!f(MISSING) 格式化符号输出浮点数 布尔值:使用 %! (MISSING)和 ...

  2. 将Linux下编译的warning警告信息输出到文件中

    Linux中,脚本语言环境中,即你用make xxx即其他一些普通 linux 命令,比如ls,find等,不同的数字,代表不同的含义:  数字 含义 标准叫法 0 标准输入 stdin = stan ...

  3. LINUX系统以及ANDROID 平台log信息输出级别设置 [MTK]

    一.LK层: 首先,在LK中,有一个对log打印级别的控制文档,其路径一般为:vendor\mediatek\proprietary\bootable\bootloader\lk\include\de ...

  4. linux如何手动释放内存吗,Linux如何手动清理内存中cache信息

    当在Linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching.那么Linux如何手动清理内存中cache信息?下面跟着学习啦小编一起来了解一下吧. ...

  5. linux当前内核版本是多少钱,Linux查看版本当前操作系统内核信息

    1. # uname -a (Linux查看版本当前操作系统内核信息) 输出 Linux xxx 4.4.--generic #~14.04.-Ubuntu SMP Wed Jul :: UTC x8 ...

  6. java中的print println printf 异同

    转自 https://blog.csdn.net/qq_40077114/article/details/81169512 println在JAVA中常常使用System.out.pirntf():的 ...

  7. linux中的shell有printf吗,Linux Shell系列教程之(八)Shell printf命令详解

    在上一篇:Linux Shell系列教程之(七)Shell输出这篇文章中,已经对Shell printf命令有了一个简略的介绍,本篇给大家详细介绍下Shell中的printf命令. 一.Shell p ...

  8. 将Linux脚本中的正常输出,警告,错误等信息输出到文件中

    将Linux脚本中的正常输出,警告,错误等信息输出到文件中 转载于:https://www.cnblogs.com/lwmp/p/7700339.html

  9. linux 自定义shell命令,如何在Linux中自定义bash命令提示符

    前言 众所周知, bash (the B ourne- A gain Sh ell)是目前绝大多数 Linux 发行版使用的默认 shell.本文将会介绍如何通过添加颜色和样式来自定义 bash 命令 ...

最新文章

  1. java注释风格 与javadoc
  2. 荣品瑞星微RK3399-RP3399开发板
  3. Java-protected的使用范围
  4. C++编程模拟生产者消费者模型
  5. nginx / 安装、部署和启动
  6. HTTP 协议的三次握手
  7. java 命令行 编译 jar文件_用命令行编译java并生成可执行的jar包
  8. OpenShift 4 - Fedora CoreOS (1) - 最简安装
  9. C语言程序设计学习总结
  10. FRM考试时间明细,FRM考试全方面日程表
  11. php 微信公众号登录,PHP 实现微信公众号网页授权登录
  12. 奇虎360 php t5级别,奇虎360凭什么估值3800亿?核心价值只是他而已!
  13. 国开网电大 动物常见病防治 形考任务1-5
  14. web服务器和应用服务器的区别
  15. 【毕业设计】基于STM32的智能路灯设计与实现 - 物联网 嵌入式 单片机
  16. xilinx vivado 2019 cordic ip 计算sin cos
  17. Android实现扫一扫识别图像数字(使用训练的库拍照查看扫描结果)(下)
  18. 训练好的深度学习模型是怎么部署的?
  19. 三星新硬盘 旧硬盘_我应该如何存放旧硬盘和电子组件?
  20. 古代的银子和现在的人民币换算关系..

热门文章

  1. 【Python基础知识-pycharm版】第八节-面向对象编程/类
  2. 压缩可以卸载吗_番禺街坊注意!微信发送高清大文件不压缩,网友:QQ可以卸载了?...
  3. python节日贺卡图片大全_新年贺卡图片_新年贺卡手工制作图片
  4. Mock Server实践
  5. Java动态追踪技术探究 1
  6. 阿里P8架构师谈:MongoDB、Hbase、Redis等NoSQL优劣势、应用场景
  7. 开源开放 | 《大词林》开源 75 万核心实体和围绕核心实体的细粒度概念、关系列表...
  8. 最全目标检测相关资料整理 (目标检测+数据增强+卷价神经网络+类别不均衡...)
  9. 记录对String.format(Formatter().format())方法的总结
  10. SSM:Cause: java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束的解决