!!版权声明:本文为博主原创文章,版权归原文作者和博客园共有,谢绝任何形式的 转载!!

作者:mohist

fmt 源码: https://github.com/fmtlib/fmt

fmt官方文档: https://fmt.dev/latest/index.html#compact-binary-code

本文源自对官方文档的理解。

本文使用 fmt version: 7.0.1

-----------------> <---------------------

1、准备:

  A、下载源码,使用cmake配置生成VS解决方案

  B、编译成功的动态库fmt 文件: .dll  + .lib

 

2、使用

  这里演示,创建了一个空的项目,添加了一个main.cpp文件,文件内容如下:

  添加fmt头文件:

#include "3rd_part/fmt/core.h"

  链接lib文件

#pragma comment(lib, "lib/fmtd.lib")

3、示例

  A、fmt::format 返回一个字符串

auto str = fmt::format("1、{0} = {1}\n\n", "1+1", 2);

  B、使用 fmt::memory_buffer 可以避免构造使用string

    fmt::memory_buffer out;
format_to(out, "2、For a moment, {} happened.\n\n", "nothing");
// 这里输出的也是一个char字符串
fmt::print(out.data());

  注意,使用 fmt::memory_buffer 需要额外包含头文件:

// 使用 memory_buffer 包含的头文件
#include "3rd_part/fmt/format.h"

  C、fmt::print输出结果

    auto err_no = 1;
fmt::print(stderr, "3、System error code = {}\n\n", err_no);
fmt::print("3、Don't {}\n\n", "panic");

  D、 Format API也支持设置位置索引(格式化)

fmt::print("4、I'd rather be {1} than {0}.\n\n", "right", "happy");

  E、可以使用fmt::arg指定替换参数的值, 这样就可以很清晰的知道每个参数的值

    fmt::print("5、Hello, {name}! The answer is {number}. Goodbye, {name}.\n\n",
fmt::arg("name", "World"),
fmt::arg("number", 99) );

  F、若编译器支持c++ 11用户自定义的文本, 后缀 _a提供了一种可以选。 更加简明的语法示例如下:

fmt::print("6、Hello, {name}! The answer is {number}. Goodbye, {name}.\n\n",
"name"_a = "World",
"number"_a = 42);

  

3、其他

  fmt的类型是安全的。 自动内存管理避免了内存泄漏的情况,使用 异常捕获 或者在编译时提示格式化字符串中的错误。例如:

fmt::format("The answer is {:d}", "forty-two");上面的代码将会抛出异常: format_error 。 format_error的内容:未知的格式字符格式‘d’

  因为 "forty-two" 是一个字符串, 而 格式化字符串中‘d’仅仅表示接收的是一个整数。

  

  下面的代码 在编译的时候会抛出一个错误,原因和上面是一样的,

 format(FMT_STRING("The answer is {:d}"), "forty-two");

  

4、宽字符的格式化

  下面的代码, 当编译时,也会抛出一个错误, 因为 宽字符 L'\x42e'无法格式为一个普通字符串。

fmt::format("Cyrillic letter {}", L'\x42e');

  若需要使用宽字符, 可以使用下面的方法,格式化得到一个宽字符的字符串。 注意:格式化 字符串中多了一个 【L】 

fmt::format(L"Cyrillic letter {}", L'\x42e');

----------------------------------------------------------------------------------------------

main.cpp的完整源码如下:

#include "3rd_part/fmt/core.h"

// -------------------------------------------------------------------------------
// 使用 memory_buffer 包含的头文件
#include "3rd_part/fmt/format.h" #include <string>
#include <iostream> // _a前缀必须引用的命名空间
using namespace fmt::literals; #pragma comment(lib, "lib/fmtd.lib") int main(int argc, char * argv[])
{ // 1、fmt::format 返回一个字符串
auto str = fmt::format("1、{0} = {1}\n\n", "1+1", 2);
std::cout << str << std::endl; // 2、使用 fmt::memory_buffer 可以避免构造使用string
fmt::memory_buffer out;
format_to(out, "2、For a moment, {} happened.\n\n", "nothing");
// 这里输出的也是一个char字符串
fmt::print(out.data()); // 3、fmt::print输出结果
auto err_no = 1;
fmt::print(stderr, "3、System error code = {}\n\n", err_no);
fmt::print("3、Don't {}\n\n", "panic"); // 4、Format API也支持设置位置索引(格式化)
fmt::print("4、I'd rather be {1} than {0}.\n\n", "right", "happy"); // 5、可以使用fmt::arg指定替换参数的值, 这样就可以很清晰的知道每个参数的值
fmt::print("5、Hello, {name}! The answer is {number}. Goodbye, {name}.\n\n",
fmt::arg("name", "World"),
fmt::arg("number", 99) ); // 6、若编译器支持c++ 11用户自定义的文本, 后缀 _a提供了一种可以选。 更加简明的语法示例如下:
fmt::print("6、Hello, {name}! The answer is {number}. Goodbye, {name}.\n\n",
"name"_a = "World",
"number"_a = 42); // ------------------------------------------------------------------------------- // 7、fmt的类型是安全的。 自动内存管理避免了内存泄漏的情况,使用 异常捕获 或者在编译时提示格式化字符串中的错误。例如:
// fmt::format("The answer is {:d}", "forty-two");
// 上面的代码将会抛出异常: format_error 。 format_error的内容:未知的格式字符格式‘d’
// 因为 "forty-two" 是一个字符串, 而 格式化字符串中‘d’仅仅表示接收的是一个整数。 // 下面的代码 在编译的时候会抛出一个错误,原因和上面是一样的,
// format(FMT_STRING("The answer is {:d}"), "forty-two"); // -------------------------------------------------------------------------------
// 8、下面的代码, 当编译时,也会抛出一个错误, 因为 宽字符 L'\x42e'无法格式为一个普通字符串。
// fmt::format("Cyrillic letter {}", L'\x42e');
// 若需要使用宽字符, 可以使用下面的方法,格式化得到一个宽字符的字符串。 注意:格式化 字符串中多了一个 【L】
fmt::format(L"Cyrillic letter {}", L'\x42e'); system("pause");
return 0;
}

  编译输出结果:

:D  完。

继续阅读文档与源码

win10 1909+ vs2015up3 使用fmt概述(fmt version 7.0.1)的更多相关文章

  1. win10使用cmake配置fmt生成vs2015解决方案(fmt version 7.0.1)

    !!版权声明:本文为博主原创文章,版权归原文作者和博客园共有,谢绝任何形式的 转载!! 作者:mohist 本文仅为参考,请以实际情况为准, fmt版本: 7.0.1 准备 下载源码fmt : htt ...

  2. 国际化标签 <fmt:bundle>&<fmt:message>的使用

    国际化标签 <fmt:bundle>&<fmt:message>的使用 Message.properties文件: name=www.gis520.com #info= ...

  3. 日期格式化标签<fmt:formatDate>&<fmt:setTimeZone>时区标签的使用demo

    日期格式化标签<fmt:formatDate>&<fmt:setTimeZone>时区标签的使用demo <%@ page contentType="t ...

  4. Win10下 VS2017 安装失败 未能安装包“Microsoft.VisualStudio.AspNet45.Feature,version=15.0.26208.0”

    事情的起因是这样的,前段时间,VS2017发布当天,想在自己的Win10上安装VS2017,然而,由于自己的系统很久没有更新(PS:自己关闭了Windows更新). 安装提示:未能安装包“Micros ...

  5. <停车卫> 产品需求说明书 version 2.0

    <停车卫> 产品需求说明书 文档版本号: Version 2.0 文档编号: xxxx 文档密级: 归属部门/项目: 产品名: 停车卫 子系统名: 编写人: kina 编写日期: 2015 ...

  6. 2018最新win10 安装tensorflow1.4(GPU/CPU)+cuda8.0+cudnn8.0-v6 + keras 安装CUDA失败 导入tensorflow失败报错问题解决

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9747019.html 基本开发环境搭建 1. Microsoft Windows 版本 关于W ...

  7. ASP.NET Core: You must add a reference to assembly mscorlib, version=4.0.0.0

    ASP.NET Core 引用外部程序包的时候,有时会出现下面的错误: The type 'Object' is defined in an assembly that is not referenc ...

  8. 记一次jdk升级引起的 Unsupported major.minor version 51.0

    之前jdk 一直是1.6,tomcat 是6.x 版本,, 现在引入的新的jar, 出现 Caused by: java.lang.UnsupportedClassVersionError: org/ ...

  9. 未能加载文件或程序集“Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0ebd12fd5e55cc5”或它的某一个依赖项。系统找不到指定的文件。

    在创建ASP.NET MVC项目过程中发生了这个异常 未能加载文件或程序集"Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0 ...

随机推荐

  1. P3438 [POI2006]ZAB-Frogs

    P3438 [POI2006]ZAB-Frogs 给出一个不一样的解法.不需要用到斜率优化等高级算法. 下文记 \(n=w_x,m=w_y\). 首先,答案显然满足可二分性,因此二分答案 \(d\in ...

  2. Pycharm的简单配置和使用

    外观 Ctrl+滚轮改变字体大小:file -> Setting ->Editor-〉General -> Mouse: 字体.颜色:file->settings->Ed ...

  3. phpMyAdmin简介及安装

    phpMyAdmin是一个MySQL数据库管理工具,通过Web接口管理数据库方便快捷. Linux系统安装phpMyAdmin phpMyAdmin是一个MySQL数据库管理工具,通过Web接口管理数 ...

  4. python爬虫采集

    python爬虫采集 最近有个项目需要采集一些网站网页,以前都是用php来做,但现在十分流行用python做采集,研究了一些做一下记录. 采集数据的根本是要获取一个网页的内容,再根据内容筛选出需要的数 ...

  5. 使用 CliWrap 让C#中的命令行交互举重若轻

    在代码中进行命令行交互是一个很常见的场景, 特别是在一些CI CD 自动化流程中, 在这之前我们会使用 System.Diagnostics.Process API, 现在有一个更灵活的工具 CliW ...

  6. 巩固javaweb的第二十一天

    巩固内容:对输入信息进行验证 JavaScript 语言 在 Web 应用中需要在客户端执行的功能可以使用 JavaScript 语言编写,在使用的时候 需要把 JavaScript 代码放在下面的两 ...

  7. 技术管理进阶——Leader的模型、手段及思维

    这里可以添加关注交流一下嘛-- 本文更多的是个人认知,有不足请批评. ​Case 在之前一次年底考评的时候,有一位leader将一个案例同时用到了自己和下属身上,老板发出了责问: 这个项目到底你是负责 ...

  8. SpringCloud微服务实战——搭建企业级开发框架(三十二):代码生成器使用配置说明

    一.新建数据源配置 因考虑到多数据源问题,代码生成器作为一个通用的模块,后续可能会为其他工程生成代码,所以,这里不直接读取系统工程配置的数据源,而是让用户自己维护. 参数说明 数据源名称:用于查找区分 ...

  9. web必知,多终端适配

    导读 移动端适配,是我们在开发中经常会遇到的,这里面可能会遇到非常多的问题: 1px问题 UI图完美适配方案 iPhoneX适配方案 横屏适配 高清屏图片模糊问题 ... 上面这些问题可能我们在开发中 ...

  10. vmware使用nat连接配置

    一.首先查看自己的虚拟机服务有没有开启,选择电脑里面的服务查看: 1.计算机点击右键选择管理  2.进入管理选择VM开头的服务如果没有开启的话就右键开启  二.虚拟机服务开启后就查看本地网络虚拟机的网 ...