如果配置中未使用字段,则修复警告 "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;
}
我有一个 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;
}