You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效存储类名字面量以传递给接受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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 22:17:36