【问题标题】:Using [[maybe_unused]] attribute on unused class *tors在未使用的类 *tors 上使用 [[maybe_unused]] 属性
【发布时间】:2017-11-30 21:09:17
【问题描述】:

问题

我应该在未使用的类 *tors 上使用 [[maybe_unused]] attribute 吗?

示例

让我们考虑以下示例:

public: struct keyData{
    public: [[maybe_unused]] keyData(){};
    public: keyData(::std::chrono::steady_clock::time_point timestamp)
        : lastMod(timestamp)
    {};

    protected: ::std::chrono::steady_clock::time_point lastMod = ::std::chrono::steady_clock::now();
};

我想使用缓存的time_point 时间戳初始化多个keyDatas。但是,我还提供了初始化keyData 的无参数构造函数,将lastMod 设置为now(),因为没有提供时间戳。

我是否应该像示例代码中那样使用[[maybe_unused]] 参数标记未使用的public: keyData(){};

研究

[[maybe_unused]]Standard attributes 网站的描述说(粗体是我的)

出现在类、typedef、变量、非静态数据成员、函数、枚举或枚举器的声明中。如果编译器对未使用的实体发出警告,则对于声明为 may_unused 的任何实体都会抑制该警告。

  • Constructors and member initializer lists 网站说(粗体是我的)

    构造函数是一个类的特殊非静态成员函数,用于初始化其类类型的对象。

  • Destructors 网站说(粗体是我的)

    析构函数是一个特殊成员函数,在对象的生命周期结束时调用。

  • operator overloading 网站说(粗体是我的)

    重载的运算符是具有特殊函数名称的函数

所以如果我理解得很好,*tors 是函数,作为函数它们可以标记为[[maybe_unused]],不是吗?

【问题讨论】:

  • 您的代码似乎有 Java/C#-itis 的坏情况。症状包括不断需要用访问类标记每个成员声明。
  • std 之前还有一个不必要的前导 ::。如果 anyone 声明命名空间 std::chrono not::std::chrono 相同,它们将立即被解雇。焦油和羽毛也是合适的。所以::std中的::一点用处都没有。
  • 不确定that edit of yours 是什么,我希望这是一个错字,而不是破坏这个问题。以防万一,如果您希望取消与此答案的关联,我认为正确的做法是要求版主通过问题上的自定义标志来这样做。

标签: c++ attributes c++17


【解决方案1】:

我应该在未使用的类 *tors 上使用 [[maybe_unused]] 属性吗?

[[maybe_unused]] 的目的是防止向编译器发出警告,这些警告可能会警告未使用的合格项目。您的编译器是否会警告未使用的构造函数?如果是这样,那么您应该使用它来抑制该警告。

但由于大多数编译器不会对废弃函数发出警告,因此最好不要打扰。该属性只会占用空间。

除非您将您的库宣传为-Wunused-member-function 干净,否则您最好不要取消此警告。毕竟,想要使用该警告的用户实际上希望该警告存在。并且不使用警告的用户不需要[[maybe_unused]] 看似随意地到处撒播。

【讨论】:

  • 这与 mine 编译器无关。将来可能想添加-Wunused 标志。
  • @Benio:这会导致未使用的构造函数出现警告吗?因为上次我检查时,所有 -Wunused 标志都是关于变量,而不是函数。
  • 在今天的“Clang 对一切都有警告”的版本中,我们介绍了-Wunused-member-function (wandbox.org/permlink/z4mR22yroFpAkY9G)。
  • 除了有趣之外,我同意这个答案。我可能会添加“如果您从未在打开此警告的情况下编译代码,请不要抑制警告。其他人可能希望有一天使用此警告编译代码,并期望得到未使用的构造函数的诊断。做那个人帮个忙,别管警告。”
猜你喜欢
  • 2018-11-19
  • 1970-01-01
  • 2017-06-08
  • 2023-03-23
  • 1970-01-01
  • 2016-04-17
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
相关资源
最近更新 更多