有选择地抑制未使用的lambda的“未使用的变量”警告

时间:2013-11-19 15:47:41

标签: c++ c++11 lambda compiler-warnings

有没有办法抑制特定文件,命名空间或特定变量的“未使用的变量”警告?

我问,因为我有一个包含大量lambda函数的命名空间。有些现在没有使用,但可能会及时使用。如果这些是常规免费功能,如果有些未使用,我不会收到警告。但是,因为它们是lambdas,所以我最终得到了一堆编译器警告。

想要使用编译器标志来删除所有这种类型的警告,因为通常情况下,让编译器捕获未使用的变量非常有用。但是,有关未使用的实用程序功能的一堆警告会将噪音添加到其他有用的信息中。

4 个答案:

答案 0 :(得分:6)

有两种方法可以想到。首先,大多数构建环境都支持每个源代码编译器标志,因此您应该能够针对定义了所有这些lambda的单个文件关闭该警告。

然后有一种通用方法可以对单个变量的这种警告进行静音:使用它,但实际上并没有对它做任何事情。在某些编译器上,这可以通过简单的转换来实现:

auto x = /* ... */;
(void) x;

但更有效的是定义一个简单的函数,使其(对于编译器)看起来好像使用了变量:

template <class T>
void ignore_unused(T&) {} 

//later...
auto x = /* ... */;
ignore_unused(x);

请注意,该参数没有名称,因此编译器不会抱怨那个未被使用。

这个想法非常普遍:用变量做一些有效的操作,但静态分析器会发出“未使用的变量”警告。

Boost具有类似的功能,boost::ignore_unused_variable_warning()

有关详细信息,请参阅Herb Sutter's blog

答案 1 :(得分:3)

在C ++中,您可static_castvoid提供任何内容。

如果不会产生任何副作用或人们可能会问的价值,这种演员有什么用?

准确地告诉编译器对象是以便携方式“使用”的。

所以,

auto x =  /*...*/;
static_cast<void>(x);

答案 2 :(得分:2)

Lambdas是just syntactic sugar for functors。 Functor是一种对象(一个operator()重载的对象)。因此,如果该变量(对象)未使用,编译器将发出警告。

我推荐使用block-comment方法来隐藏编译器;)。除此之外,在一般情况下,选择性地干净地使编译器无声,你无能为力。

请注意,如果您有更具体的案例,例如在函数中传递参数,如果您不使用它,则可以make the argument nameless。你可以做的另一件事是put a (void)var reference somewhere in your code(尽管这是作弊;现在你引用了它!)。最后,如果您的编译器支持它(全能的GCC支持),您可以尝试使用the __attribute__((unused)) preprocessor directive(使用[[gnu::unused]]进行Clang)。

根据您的具体情况,这些建议可能会有所帮助,也可能没有帮助。

答案 3 :(得分:1)

如何将lambdas隐藏在发电机内部。这样,除非使用它们,否则它们甚至不会被创建。所以而不是:

auto add_one= [](int x){ return x + 1 } ;

使用:

std::function<int(int)> gen_addone(void)
{
    static auto l_= [](int x){ return x + 1 ; } ;
    return l_ ;
}   

抱歉,您必须等到c ++ 1y才能获得自动退货类型。