新闻详情

新闻详情

首页 / 资讯中心 / 详情

fmt 如何用 as_identifiers 注解把枚举值格式化为枚举名称

发布时间:2026/9/13 19:33:48来源:尧图网络
fmt 如何用 as_identifiers 注解把枚举值格式化为枚举名称
fmt 如何用 as_identifiers 注解把枚举值格式化为枚举名称【免费下载链接】fmtA modern formatting library项目地址: https://gitcode.com/GitHub_Trending/fm/fmt在 C 日志和调试输出里直接打印一个 scoped enum 经常需要先强转成整型得到的是1、42这样的数字而不是red、green这样的名字。{fmt} 的fmt/enum.h提供了fmt::as_identifiers注解给枚举类型加上这个注解后fmt::format/fmt::print会直接把枚举值格式化为与之匹配的枚举项标识符。本文给出从标注枚举、编译到验证输出结果的完整路径。前提是你的编译器支持 C26 的 reflection 和 annotations 特性——文档明确说明这是该功能的硬性要求例如 GCC 可能需要额外的编译标志-freflection。前提确认编译器是否支持 reflection功能可用性由宏FMT_USE_REFLECTION决定它被设为1当编译器提供 reflection检测__cpp_impl_reflection与__cpp_lib_reflection两个特性宏设为0否则。用户也可以自己定义该宏来关闭reflection 的使用。没有 reflection 支持时仓库自带的测试 test/enum-test.cc 的行为是只打印一行Reflection is not supported.然后跳过所有断言也就是说枚举格式化功能整体不生效而不是编译失败。如果以 C 模块方式使用 {fmt}文档还有一条边界reflection 支持在模块本身被编译时检测因此只有当模块是在启用 reflection 的情况下构建的import 方才能使用这套 API。给枚举添加 as_identifiers 注解fmt/enum.h中定义了注解值本身见 include/fmt/enum.hFMT_EXPORT inline constexpr auto as_identifiers as_identifiers_t();文档给出的用法是把注解直接写在枚举声明上并#include fmt/enum.h#include fmt/enum.h enum class [[fmt::as_identifiers]] color { red, green, blue }; fmt::print({}, color::green); // Output: green文档同时注明clang-format 目前还不支持注解语法仓库测试代码里在用注解的枚举前后加了// clang-format off/// clang-format on来避免被格式化工具打乱如果你的项目跑 clang-format 可以照做。未加注解的枚举行为不变fmt::is_formattablecolor::value对带注解的枚举为true对不带注解的枚举为false见 test/enum-test.cc 中的annotation_is_required测试。未标注的 scoped enum 仍需要走format_as或formatter特化这条路。格式化的具体行为与验证文档doc/api.md 的 Enum Formatting 一节给出的示例输出如下可作为运行后的核对基准匹配到枚举项时输出标识符fmt::print({}, color::green); // Output: green支持字符串格式说明符按 Format Specification 处理fmt::print([{:7}], color::red); // Output: [ red]仓库测试里还有{:*^7}→**red**、{:.2}→gr的用法见 test/enum-test.cc 的format_enum_specs测试。多个枚举项取相同值时使用声明顺序中第一个enum class [[fmt::as_identifiers]] alias { one 1, uno 1 }; fmt::format({}, alias::uno); // 结果为 one没有匹配枚举项的值按底层值以十进制表示再套用字符串格式fmt::print({}, static_castcolor(42)); // Output: 42测试中还覆盖了几个容易踩坑的底层类型char底层类型不匹配时按十进制数字输出static_castbyte_enum(65)输出65而不是字符Abool底层类型输出1/0而不是true/false带负值的枚举如minus_two -2可以正常解析出标识符。这些都可以直接在你的验证程序里复现。编译与运行验证接入方式按你项目的现有构建体系选一种即可文档doc/get-started.md列出的 CMake 路径有三种FetchContentCMake 3.11FetchContent_Declare(fmt ...)后FetchContent_MakeAvailable(fmt)再target_link_libraries(your-target fmt::fmt)Installedfind_package(fmt)后链接fmt::fmtEmbedded把 {fmt} 源码树放进工程add_subdirectory(fmt)后链接fmt::fmt。要启用注解功能编译时开启编译器对 reflection 的支持GCC 示例标志为-freflection。验证是否生效的最小程序就是上面的color例子编译运行后看到green输出即代表注解生效如果FMT_USE_REFLECTION为 0功能不可用行为等同未引入该头文件。在仓库内做完整验证按文档的源码构建流程走mkdir build cd build cmake .. make make test其中enum-test是注册在 test/CMakeLists.txt 中的正式测试项覆盖了基础格式化、未作用域枚举、各种底层类型、未匹配值回退、格式说明符以及is_formattable判定全部通过即说明当前工具链下该功能工作正常。限制文档明确给出的边界有两条编写代码时需要注意标识符只能是char字符串带注解的枚举不能用其他字符类型如wchar_t格式化只对加了注解的枚举生效同一工程里未标注的枚举行为保持原样不会意外改变输出。另外测试中展示了内部实现按枚举值密度选择查表或哈希表两种查找方式如dense/holey/sparse几个测试枚举但这属于实现细节对使用方来说无论哪种路径上面的格式化和回退行为是一致的。【免费下载链接】fmtA modern formatting library项目地址: https://gitcode.com/GitHub_Trending/fm/fmt创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

verl 中的 NVFP4 QAT 量化感知训练:从 BF16 训练到 FP4 推理的全链路实战指南 2026/9/13 20:18:53

verl 中的 NVFP4 QAT 量化感知训练:从 BF16 训练到 FP4 推理的全链路实战指南

verl 中的 NVFP4 QAT 量化感知训练:从 BF16 训练到 FP4 推理的全链路实战指南 【免费下载链接】verl verl/HybridFlow: A Flexible and Efficient RL Post-Training Framework 项目地址: https://gitcode.com/GitHub_Trending/ve/verl 导读 本文全面讲解 v…

阅读更多 →
基于plc的全自动玻璃切割机控制系统设计 2026/9/13 20:18:53

基于plc的全自动玻璃切割机控制系统设计

文章目录摘要设计内容控制部分设计效果图资源获取摘要 为了设计出应用在工业级生产当中,高效、精准的玻璃自动切割机器,改变传统费时费力的人工切割玻璃的方式,实现对不同规格的玻璃进行理想图形切割,减少人工操作带来的风险&…

阅读更多 →
Rasa Reminderbot 实战指南:用 ReminderScheduled 事件实现外部事件触发与定时提醒 2026/9/13 20:18:53

Rasa Reminderbot 实战指南:用 ReminderScheduled 事件实现外部事件触发与定时提醒

Rasa Reminderbot 实战指南:用 ReminderScheduled 事件实现外部事件触发与定时提醒 【免费下载链接】rasa 💬 Open source machine learning framework to automate text- and voice-based conversations: NLU, dialogue management, connect to Slack, …

阅读更多 →
LKY_OfficeTools 多语言支持怎么开:Mocreak 国际化更新完整指南 2026/9/13 20:18:53

LKY_OfficeTools 多语言支持怎么开:Mocreak 国际化更新完整指南

LKY_OfficeTools 多语言支持怎么开:Mocreak 国际化更新完整指南 【免费下载链接】LKY_OfficeTools 一键自动化 下载、安装、激活 Office 的利器。 项目地址: https://gitcode.com/GitHub_Trending/lk/LKY_OfficeTools LKY_OfficeTools 是款一键下载、安装、激…

阅读更多 →
嵌入式软硬件协同的五大时序断层与破局机制 2026/9/13 20:18:53

嵌入式软硬件协同的五大时序断层与破局机制

1. 这不是甩锅,是嵌入式开发里最真实的“时间差”现象“嵌入式项目里,硬件工程师和软件工程师为什么经常‘互相等’?”——这句话在凌晨两点的项目群、在每周例会的沉默三秒、在量产前最后一版PCB改板通知发出后,反复出现。它不是…

阅读更多 →
GoFr 应用调试指南:使用 pprof 进行 CPU、内存与协程性能剖析 2026/9/13 20:15:52

GoFr 应用调试指南:使用 pprof 进行 CPU、内存与协程性能剖析

GoFr 应用调试指南:使用 pprof 进行 CPU、内存与协程性能剖析 【免费下载链接】gofr An opinionated GoLang framework for accelerated microservice development. Built in support for databases and observability. 项目地址: https://gitcode.com/GitHub_Tre…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞