如果配置中未使用字段,则修复警告“未使用字段 a”的好方法

Uni*_*ick 6 c++ clang compiler-warnings

我有一个带有字段的类,我将其输出到日志。如果日志被关闭(例如在发布中),我会收到警告(不使用私有字段“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;
}
Run Code Online (Sandbox Code Playgroud)

我将 clang 与 -Wall 一起使用:

clang main.cpp -Wall
Run Code Online (Sandbox Code Playgroud)

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

Sne*_*tel 7

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

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

private:
    [[maybe_unused]] int a_;
};
Run Code Online (Sandbox Code Playgroud)


Bau*_*gen 2

#define  LOG(a) ((void)a)
Run Code Online (Sandbox Code Playgroud)

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

小警告:即使禁用日志记录,这也将始终评估参数表达式。如果表达式只是一个变量,那没关系,但对于函数调用等,它可能会。