VS2019使用Spdlog时Intellisense报fmt类型匹配错误如何解决
VS2019 Intellisense误报Spdlog格式字符串类型不匹配问题解决方法
这个问题是VS2019 Intellisense的已知原生缺陷,和你的代码、项目配置没有关系:
Spdlog 1.9.2默认绑定了fmt 8.x版本,引入了编译时格式字符串检查功能,依赖C20的概念、变长模板参数推导特性。VS2019的MSVC编译器对这部分特性的实现是完整的,所以你的代码可以正常编译运行,但VS2019的Intellisense模块对这类C20新特性的支持存在缺陷,会错误推导模板参数,触发类型匹配失败的误报。
可行解决方法
- 新增预处理器宏屏蔽误报
在项目属性的「C/C++ -> 预处理器 -> 预处理器定义」中新增如下宏即可,不会影响实际编译阶段的格式字符串检查功能:
如果希望只在Intellisense运行时生效,也可以直接添加条件判断的宏定义:SPDLOG_DISABLE_DEFAULT_FORMAT_STRING_CHECK#ifdef __INTELLISENSE__ #define SPDLOG_DISABLE_DEFAULT_FORMAT_STRING_CHECK #endif - 换用Spdlog层级简写API
不需要手动调用log方法传日志级别,直接用对应级别的简写接口,绝大多数情况下可以避免Intellisense的模板推导误报:// 替换logger->log(spdlog::level::info, "...", args)写法 logger->info("This does not {}", test); - 显式指定格式字符串类型
如果必须使用通用log方法,可以手动强转格式字符串为匹配的fmt::format_string类型,强制Intellisense匹配类型:logger->log(spdlog::level::info, fmt::format_string<const std::string&>("This does not {}"), test); - 降级Spdlog版本到1.8.x
1.8.x版本的Spdlog还没有引入编译时格式字符串检查功能,不会触发这个Intellisense误报。 - 升级Visual Studio到2022及以上版本
VS2022 17.0及以上版本的Intellisense已经完善了对相关C++20特性的支持,这个误报问题已经被官方修复。
你没有遗漏任何项目配置,该误报不会影响实际代码的编译、运行效果,不需要额外处理也可以正常开发。
内容的提问来源于stack exchange,提问作者aghidini
相关产品推荐
相关产品推荐

