首页 > 其他分享 >LOG("my log is", K(val1), K(val2));

LOG("my log is", K(val1), K(val2));

时间:2023-06-15 15:31:44浏览次数:20  
标签:BODY char print val2 val1 my


旧时代

假设有 val1,val2两个值,希望打印出来。直接的做法是:

PRINTF(“my log is val1=%d, val2=%d”, val1, val2);

这个代码的缺陷是:

  • val1、val2要重复写两次,若变量更改,需要写两次。
  • 如果 val1、val2 是字符串类型,则格式化方式要改变
  • 如果 val1、val2 是对象类型,则无法直接用 PRINTF,需要预先手工把对象转成字符串,然后用 %s 打印

新科技

(例1)如果 val1=1024, val2=4096.5

LOG(“my log is”, K(val1), K(val2));
输出:
my log is val1=1024,val2=4096.5

(例2)如果 val1=”hello”, val2=true

LOG(“my log is”, K(val1), K(val2));
输出:
my log is val1=hello,val2=true

实现思路

假设最多处理 10 个 KV。用宏展开 + Template。一般来说,LOG 记录 10 个 KV 足够。如果需要处理更多 KV,多重复点宏展开代码即可。

定义 10 个函数

(为了降低工作量,可以用宏展开的方式来定义):

- my_print_1(info, char *key1, typename val1);
 - my_print_2(info, char *key1, typename val1,  char *key2, typename val2);
 - my_print_3(info, char *key1, typename val1,  char *key2, typename val2, char *key3, typename val3);
 - ...

实现10个函数

对于my_print_n(info, ….)

- 根据 n 展开宏 BODY(n)
- BODY(1) = print(data_buf, key1, obj1)
- BODY(2) = BODY(1) + "," + print(data_buf, key2, obj2)
- BODY(3) = BODY(2) + "," + print(data_buf, key3, obj3)
- ...

实现 print(buf, char *key, T obj)

利用模板实现,基础数据类型直接匹配并输出,对象类型调用 to_string 方法输出到 buf。

具体落实到工程代码上还有一些细节,以上就是总体思路。

结尾

提个问题:my_print_10 函数最终会生成多少个函数模板实例?


标签:BODY,char,print,val2,val1,my
From: https://blog.51cto.com/u_16162111/6492793

相关文章

  • 解决mysql数据库 ‘ MySQL server has gone away’
    参考:https://www.jianshu.com/p/8c8086c11cae原因:查询的结果集超过max_allowed_packet查看执行SQL执行文件大小是否超过max_allowed_packet,如果超过则需要调整参数,或者优化语句。解决:修改参数,max_allowed_packet,比如调整为28M。要大于执行的SQL文件大小setglobalmax_a......
  • MySQL如何初始化常量Item?
    MySQL中的一切表达式都是继承自Item类,常量也不外乎如此。以Item_float为例子说明MySQL如何初始化常量Item。首先在Parser里面:NUM_literal:NUM{interror;$$=new(YYTHD->mem_root)Item_int($1,......
  • 详解MySQL Server端如何发送结果集给客户端
    MySQLServer和Client之间的交互有一套定义得很明确的协议,称为MySQLClient/ServerProtocol。写数据库的人,只需要遵循这套协议来写程序,就能让自己的数据库被各种MySQL客户端连接,如mysql命令行,phpmysql,JDBC等等。这是一个非常诱人的设计选择(DesignChoice)!如果自己实现一套协议,写......
  • CentOs7安装部署Sonar环境(JDK1.8+MySql5.7+sonarqube7.8)
    sonarqube安装前环境准备JDK1.8、MySql5.7。一、JDK安装1、下载jdk#打开下面的网址,选择jdk-8u371-linux-x64.tar.gz进行下载(8u371版本可能会有区别,但是没有影响)http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html2、安装jdk#创建......
  • 云小课|RDS for MySQL参数模板一键导入导出,参数配置轻松搞定
    摘要:云数据库RDSforMySQL支持参数模板的导入和导出功能。本文分享自华为云社区《【云小课】【第56课】RDSforMySQL参数模板一键导入导出,参数配置轻松搞定》,作者:数据库的小云妹。云数据库RDSforMySQL支持参数模板的导入和导出功能。导入参数模板:导入后会生成一个新的参数模板,......
  • 云小课|RDS for MySQL参数模板一键导入导出,参数配置轻松搞定
    摘要:云数据库RDSforMySQL支持参数模板的导入和导出功能。本文分享自华为云社区《【云小课】【第56课】RDSforMySQL参数模板一键导入导出,参数配置轻松搞定》,作者:数据库的小云妹。云数据库RDSforMySQL支持参数模板的导入和导出功能。导入参数模板:导入后会生成一个新的参......
  • mysql和neo4j集成多数据源和事务
    在微服务大行其道的今天,按理说不应该有多数据源这种问题(嗯,主从库算是一个多数据源的很常见的场景。),但是也没人规定不能这样做。就算有人规定的,曾经被奉为圭臬的数据库三大范式现在被宽表冲得七零八落,在很多场景下,其实是鼓励建立冗余字段的。话说项目中需要用到图数据库,我们选用......
  • 基于中间件实现MySQL读写分离
    1.场景在数据库读多写少的时候2.读写分离只在主服务器上写,只在从服务器上读。使用amoeba中间件3.部署3.1Dockercompose一键部署Compose文件:version:'3.8'services:mysql_master:image:mysql:8.0.33-oracle......
  • Mybatis中SqlNode的组合模式
    组合( Composite )模式就是把对象组合成树形结构,以表示“部分-整体”的层次结构,用户可以像处理一个简单对象一样来处理一个复杂对象,从而使得调用者无需了解复杂元素的内部结构。组合模式中的角色有:抽象组件(容器):定义了树形结构中所有类的公共行为,例如add(),remove()等方法。树叶:最终......
  • windows环境下操作,同一台机器 如何跑两个mysql服务?
    在同一台机器上运行两个MySQL服务是可行的,但需要注意以下几点:确保端口号不冲突。每个MySQL服务都需要监听一个独立的端口,以便客户端可以连接到正确的服务。配置文件的区分。每个MySQL实例需要有自己独立的配置文件,包括数据存储路径、日志文件路径等信息。确保资源......