如果配置中未使用字段,则修复警告 "field a is not used" 的好方法

Good way to fix warning "field a is not used" if field is unused in configuration

我有一个 class 字段,我将其输出到日志中。如果关闭日志(例如在 Release 中),我会收到警告(未使用私有字段 'a_'),因为我仅使用此字段输出到日志。

样本:

#include <iostream>

//#define TURNON_LOG

#ifdef TURNON_LOG
  #define  LOG(a) printf("%d", a)
#else
  #define  LOG(a) 0
#endif

class A
{
public:
    A(int a) : a_(a)
    {
        LOG(a_);
    }

private:
    int a_;

};

int main(int argc, const char * argv[])
{
    A a(10);
    return 0;
}

我将 clang 与 -Wall 一起使用:

clang main.cpp -Wall

如果 TURNON_LOG 未定义,修复警告的最佳方法是什么?

#define  LOG(a) ((void)a)

#else 情况下应该可以解决问题。

小警告:这将始终计算参数表达式,即使在禁用日志记录时也是如此。如果表达式只是一个变量,那无关紧要,但对于函数调用等,它可能。

除了 Baum mit Augen 的回答之外,对于 Clang(或任何 C++17 或更高版本的编译器),您可以使用 [[maybe_unused]] 属性来消除针对可能未使用的特定变量的警告。

class A
{
public:
    A(int a) : a_(a)
    {
        LOG(a_);
    }

private:
    [[maybe_unused]] int a_;
};

对于已经提供的解决方案,一个额外的解决方案是#ifdef 以及相关部分。

绝对不是一个好的解决方案,它根本无法扩展,但在某些和有限的情况下可以解决问题:

class A
{
public:

#ifdef TURNON_LOG
    A(int a) : a_(a)
    {
        LOG(a_);
    }

private:
    int a_;
#else
    A(int) {}
#endif
};

int main(int argc, const char * argv[])
{
    A a(10);
    return 0;
}