使用printf定制化打印对象

TBOX内置的libc库,有一份自有的printf实现,在支持了所有标准格式化参数的同时,也对其进行了一些扩展,来支持自定义的格式化参数打印, 例如:

// 输出定点数:3.14
tb_printf("%{fixed}\n", tb_float_to_fixed(3.14));

// 输出ipv4地址:127.0.0.1
tb_ipv4_t addr;
tb_ipv4_set(&addr, "127.0.0.1");
tb_printf("%{ipv4}\n", &addr);

以上两种都是TBOX内置的对象参数打印,你只需要吧你需要打印的对象名和对象描述函数注册进来,就行了。

其中%{object_name} 就是自定义参数化对象打印的格式,这个是对%s、%f等标准格式的扩展,使你可以像ios中的NSLog(@"%@", object) 那样方便的打印自定义对象的内容。

例如:如果你要支持自定义打印如下内容:

typedef struct _rect_t
{
    tb_long_t x;
    tb_long_t y;
    tb_size_t w;
    tb_size_t h;

}rect_t;

tb_printf("%{rect}\n", &rect);

那么你只需要提供对应的rect对象的描述函数,并对其进行注册,就行了:

// rect对象的描述函数,将描述内容格式化到cstr中,并返回实际的字符串大小
static tb_long_t tb_printf_rect_func(tb_cpointer_t object, tb_char_t* cstr, tb_size_t maxn)
{
    // check
    tb_assert_and_check_return_val(object && cstr && maxn, -1);

    // the rect
    rect_t* rect = (rect_t*)object;

    // format
    tb_long_t size = tb_snprintf(cstr, maxn - 1, "(x: %ld, y: %ld, w: %lu, h: %lu)", rect->x, rect->y, rect->w, rect->h);
    if (size >= 0) cstr[size] = ‘\0‘;

    // ok?
    return size;
}

// 注册%{rect}对象的printf参数化打印支持,注:最好在程序初始化阶段来进行注册
tb_printf_object_register("rect", tb_printf_rect_func);

// 打印rect对象信息,显示:"(x: 10, y: 10, w: 640, h: 480)"
rect_t rect = {10, 10, 640, 480};
tb_printf("%{rect}\n", &rect);

当然不仅仅只有printf支持自定义的参数化对象打印,只要是printf系列的都支持这个特性,例如如下接口:

  • tb_printf
  • tb_snprintf
  • tb_vsnprintf
  • tb_wprintf
  • tb_swprintf
  • tb_vswprintf
  • tb_trace_i
  • tb_trace_d
  • tb_trace_e
  • tb_trace_w

等等,这些都是可以自定义的参数化对象打印,每个对象,只要注册一次就行了。


时间: 2024-10-09 03:14:50

使用printf定制化打印对象的相关文章

3D打印闪耀中博会,“湖南智造”再展新风采 ——华曙高科推出全球首款开源可定制化金属3D打印机

"2015中国中部投资贸易博览会"5月18日在武汉拉开帷幕,湖南省商务厅组织我省代表企业积极参与.其中,华曙高科技有限责任公司作为国内3D打印产业领军企业在展会发布全球首款开源可定制化金属3D打印机FS271M,成为此次展会的一大亮点. 随着我国将3D打印提升到国家战略层面,以及今年首个"国家计划"的出台,3D打印产业的发展得到越来越多人的关注.机遇与挑战并存,面对国内尚不成熟的3D打印产业发展,以及以美.德为首的国际3D打印产业巨头的市场竞争,本土3D打印企业如何

linux中内存泄漏的检测(二)定制化的malloc/free

<linux中内存泄漏的检测(一)最简单的方法>介绍了最简单的内存泄漏检测方法,这种方法虽然简单,却有很多现实的问题,导致它不能用于实际的生产中. 直接使用这种方法肯定是不现实的,因为: (1)把整个工程里所有调用malloc/free的地方都改成my_malloc/my_free,代码改动很大. (2)通常动态库和静态库的代码是没有权限修改的. 今天就来解决这个问题,动态地决定让程序使用自己的还是系统的内存管理接口. wrap选项 不希望修改产品代码,那么用于申请/释放内存的接口还是mall

大数据平台一键安装OS【定制化OS镜像制作】

 定制化 大数据平台一键安装OS 大数据平台一键安装OS系列 大数据平台一键安装OS[搭建脚本篇] 定制化OS镜像制作 1.操作环境 操作环境:VMware Workstarion 9 and vSphere client 系统:CentOS -6.8-x86_64 工具:gconf-editor anaconda repodata createrepo mkisofs rsync 2.主要思路 定制化是通过kickstart脚本来实现的,linux系统安装完毕后在root目录下会生成anaco

定制化Azure站点Java运行环境(3)

定制化Azure Website提供的默认的Tomcat和JDK环境 在我们之前的测试中,如果你访问你的WEB站点URL时不加任何上下文,实际上你看到的web界面是系统自带的测试页面index.jsp,位于/site/wwwroot/webapps/ROOT目录下,是Tomcat默认的根目录. 由于要检测JVM的usage信息以便确定,定制化修改的Java参数是否生效,所以我们需要写一些测试代码,打印出当前JVM的参数信息;首先使用FileZilla连接到你的网站,进入到/site/wwwroo

定制化Azure站点Java运行环境(5)

Java 8下PermGen及参数设置 ? 在上一章节中,我们定制化使用了Java 8环境,使用我们的测试页面打印出了JVM基本参数,但如果我们自己观察,会发现在MXBeans中,没有出现PermGen的使用数据,初始大小等信息,即使我们已经设置了大小: ? 在Java 7及以前版本中,PermGen主要存放加载的类的信息,如果设置过小,类加载失败,可能会出现OutOfMemory的经典错误,在Azure website里面的Java开发中,碰到的客户定制化设置的问题也会涉及到PermGen的大

ASP.NET Core应用的错误处理[3]:ExceptionHandlerMiddleware中间件如何呈现&ldquo;定制化错误页面&rdquo;

DeveloperExceptionPageMiddleware中间件利用呈现出来的错误页面实现抛出异常和当前请求的详细信息以辅助开发人员更好地进行纠错诊断工作,而ExceptionHandlerMiddleware中间件则是面向最终用户的,我们可以利用它来显示一个友好的定制化的错误页面.按照惯例,我们还是先来看看ExceptionHandlerMiddleware的类型定义. [本文已经同步到<ASP.NET Core框架揭秘>之中] 1: public class ExceptionHan

AI应用开发实战 - 定制化视觉服务的使用

AI应用开发实战 - 定制化视觉服务的使用 零.定制化视觉服务简介 有的时候,在构建应用的过程中,在缺少强大计算资源与高性能算法的情况下,我们不一定需要自己从零开始训练模型.我们需要用的一些轮子,已经有人给我们造好了. 就比如: 微软提供的定制化视觉服务. 在机器学习应用中,任何情况下都需要一个或大或小的模型.而怎么得到这个模型是其中最复杂的部分.定制化视觉服务相当于在云端提供了一个生成模型的方法,把模型相关的复杂的算法都简化了.同时,它不仅能够让用户自己管理训练数据,定义自己的分类问题,而且支

OA系统信用盘新增三个极速彩版本定制化视觉服务的使用

AI应用开发实战 - 定制化视觉服务的使用 OA系统信用盘新增三个极速彩版    下载地址  QQ2952777280 OA系统信用盘新增三个极速彩版本程序源码参数说明: 运行环境:php5.2+mysql 源码类别:时时彩(彩票)现金网系统/两面盘 界面语言:繁体中文 源码授权:无加密文件及认证授权,永久性可直接使用. 版本支持:PC/WAP网页版 编程语言:PHP 零.定制化视觉服务简介 有的时候,在构建应用的过程中,在缺少强大计算资源与高性能算法的情况下,我们不一定需要自己从零开始训练模型

Ubuntu定制化系统ISO制作

一.安装工具 apt-get install squashfs-toolsapt-get install mkisofs二.挂载并解压系统ISO文件 在opt目录下进行操作cd /opt/mkdir mnt livecd tool 上传要定制化的系统ISO到 /opt/tool/ 挂载ISO镜像到 /opt/mnt/下mount /opt/tool/ubuntu-16.04.2-server-amd64.iso /opt/mnt/ 复制所有的镜像文件到/opt/livecd/下cp -rp /o