C++ 选择性地抑制;“未使用变量”;未使用lambda的警告

C++ 选择性地抑制;“未使用变量”;未使用lambda的警告,c++,c++11,lambda,compiler-warnings,C++,C++11,Lambda,Compiler Warnings,有没有办法抑制特定文件、命名空间或特定变量的“未使用变量”警告 我这样问是因为我有一个包含大量lambda函数的名称空间。有些现在不使用,但可能会及时使用。如果这些是常规的免费函数,我不会被警告,如果一些是未使用的。然而,由于它们是lambda,我最终得到了一堆编译器警告 我不想使用编译器标志删除所有此类警告,因为通常情况下,让编译器捕获未使用的变量非常有用。但是,一堆关于未使用的实用程序函数的警告会给其他有用的信息增加噪音。lambda是。函子是一种对象类型(重载了操作符()的对象)。因此,如

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

我这样问是因为我有一个包含大量lambda函数的名称空间。有些现在不使用,但可能会及时使用。如果这些是常规的免费函数,我不会被警告,如果一些是未使用的。然而,由于它们是lambda,我最终得到了一堆编译器警告

我不想使用编译器标志删除所有此类警告,因为通常情况下,让编译器捕获未使用的变量非常有用。但是,一堆关于未使用的实用程序函数的警告会给其他有用的信息增加噪音。

lambda是。函子是一种对象类型(重载了
操作符()
的对象)。因此,如果该变量(对象)未使用,编译器将发出警告

我建议使用块注释方法来关闭编译器;)。除此之外,在一般情况下,您无法有选择地、干净地使编译器静音

请注意,如果您有更具体的情况,例如在函数中传递参数,则可以在不使用它的情况下使用它。你可以做的另一件事是(尽管这是欺骗;现在你已经引用了它!)。最后,如果您的编译器支持它(万能的GCC支持),您可以尝试使用(用于Clang)


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

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

然后有一种通用的方法来消除单变量的警告:使用它,但不要真正地对它做任何事情。在某些编译器上,这可以通过简单的强制转换来实现:

auto x = /* ... */;
(void) x;
但更有效的方法是定义一个简单的函数,使其看起来(对于编译器)就像使用了变量一样:

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

//later...
auto x = /* ... */;
ignore_unused(x);
模板
void ignore_unused(T&){
//后来。。。
自动x=/*…*/;
忽略未使用的(x);
请注意,该参数没有名称,因此编译器不会抱怨该参数未使用

这种想法非常普遍:对变量执行一些操作,有效地不进行任何操作,但会使发出“未使用变量”警告的静态分析器静音

Boost有一个类似的函数,
Boost::ignore_unused_variable_warning()


<更多信息,参见.< /p> C++中,您可以<代码> STATICORCAST > <代码>空白>代码> >p> 如果这种石膏不产生任何副作用或价值,那它有什么用呢

精确地告诉编译器对象是以可移植的方式“使用”的

所以

auto x=/*…*/;
静态铸型(x);

将lambda隐藏在发电机内部如何。这样一来,除非使用它们,否则它们甚至不会被创建。因此,不是:

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

std::函数gen\u addone(void)
{
静态自动l_uz=[](int x){return x+1;};
返回l_;
}   

很抱歉,您必须等到c++1y才能进行自动返回类型推断。

您使用的编译器是什么?根据编译器的不同,会有一些
#pragma
.clang。我没有用过叮当声,所以我不知道。我用过谷歌,这看起来可能有用——这很讽刺,因为这样做你根本不用它。你说“lambda只是函子的语法糖。”我曾经这么想,但我不再那么肯定了。考虑:
autof=[](intx){returnx+1;};对于(inti=0;i
。翻译成函子并不简单(我想f的按值捕获需要实现为唯一的_ptr或等价物,而不仅仅是一个普通的成员变量)。听起来像是在说“lambda非常像functor;因此,未使用的lambda将像未使用的functor一样收到警告”。但未使用的函子不会得到警告。看见
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_ ;
}