如何高效存储类名字面量以传递给接受const std::string&的日志函数?
解决方案
方案1:用std::array存储字面量,再导出constexpr指针
这是最贴合需求的方案,既满足clang-tidy的要求,又能直接传递给日志函数:
#include <array> class MyClass { private: // 用std::array存储类名字面量,规避clang-tidy的C数组警告 static constexpr std::array<char, sizeof("MyClass")> kTagArray{"MyClass"}; public: // 导出constexpr const char*,方便直接传递给日志函数 static constexpr const char* kTag = kTagArray.data(); };
- 优势:
- 完全符合Google C++风格指南:静态变量均为平凡析构类型(std::array和const char*都满足)
- 无clang-tidy警告
- 调用日志函数时直接传
MyClass::kTag即可,无需额外代码 - constexpr保证编译期初始化,运行时无额外开销
方案2:保留C数组并抑制clang-tidy警告
如果觉得方案1稍显繁琐,可以直接使用C数组,同时针对特定变量抑制clang-tidy的modernize-avoid-c-arrays警告——Google风格指南允许在必要时合理抑制lint警告:
class MyClass { public: // NOLINTNEXTLINE(modernize-avoid-c-arrays) 针对性抑制C数组警告 static constexpr const char kTag[] = "MyClass"; };
- 优势:代码更简洁,同样满足Google风格的平凡析构要求,调用方式直接
- 注意:需确保项目lint配置允许这种针对性抑制,这在实际工程中是常见做法
方案3:重载日志函数接受std::string_view
如果有权限修改日志函数的签名,可以添加一个接受std::string_view的重载版本,这样就能直接使用std::string_view作为标签:
#include <string_view> // 原日志函数 void Log(const std::string& tag, const std::string& message); // 添加重载版本 void Log(std::string_view tag, const std::string& message);
然后在类中定义标签:
class MyClass { public: static constexpr std::string_view kTag = "MyClass"; };
- 优势:无需临时构造
std::string,效率更高;std::string_view符合Google风格的平凡析构要求 - 前提:你能修改日志函数的实现
内容的提问来源于stack exchange,提问作者Eyjafl
相关产品推荐
相关产品推荐

