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

时间:2018-01-10 16:55:11

标签: 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;
}

我和-Wall使用了clang:

clang main.cpp -Wall

在未定义TURNON_LOG的情况下修复警告的最佳方法是什么?

3 个答案:

答案 0 :(得分:2)

#define  LOG(a) ((void)a)
#else案例中的

应该可以解决问题。

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

对已经提供的解决方案的另一个解决方案是#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;
}