繁体   English   中英

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

[英]Selectively suppress “unused variable” warnings for unused lambdas

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

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

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

有两种方法可以想到。 首先,大多数构建环境都启用了每个源编译器标志,因此您应该能够仅为定义了所有这些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的博客

在C ++中,你可以static_cast任何东西来void

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

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

所以,

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

Lambdas 只是算子的语法糖 Functor是一种对象(一个有operator()重载的对象)。 因此,如果该变量(对象)未使用,编译器将发出警告。

我建议使用block-comment方法来隐藏编译器;)。 除此之外,在一般情况下,你没有太多可以选择性地干净地使编译器静音。

请注意,如果您有更具体的情况,例如在函数中传递参数,则可以在不使用参数的情况下使参数无名 你可以做的另一件事是在你的代码中的某处放置一个(void)var引用 (尽管这是作弊;现在你引用了它!)。 最后,如果您的编译器支持它(全能的GCC支持),您可以尝试使用__attribute__((unused))预处理器指令 (对Clang使用[[gnu::unused]] )。

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

如何将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才能获得自动退货类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM