在 if 语句中静默 -Wunused-variable
Posted
技术标签:
【中文标题】在 if 语句中静默 -Wunused-variable【英文标题】:Silencing -Wunused-variable in an if statement 【发布时间】:2016-02-23 07:00:18 【问题描述】:以下代码会生成一个警告,指出未使用temp
(这是真的):
#include <cstdio>
int f() return 5;
int main()
if(const int& temp = f())
printf("hello!\n");
return 0;
问题是我需要在不使用 gcc -Wall
和 clang -Weverything
生成警告的情况下执行此操作(我正在实现类似于 SECTION()
的 @987654321 的东西的功能@)。
那么有什么方法可以让它静音呢?我尝试使用__attribute__((unused))
。
全局使用-Wno-unused-variable
对我来说不是一个选项,因为我正在编写一个仅标头库。
【问题讨论】:
重复问题,见***.com/questions/15053776/…if(const int& temp = 1 ? f() : temp)
Idk 如何定义有temp
,但它消除了警告,应该优化掉。
怎么用(void*)unused_variable;
您为什么需要它?如果你这样做了,你能创建一个例子来展示它吗?
@juanchopanza SECTION()
Catch 中的东西是这样实现的,我不知道该怎么做
【参考方案1】:
#include <cstdio>
int f() return 5;
int main()
if (const int &temp __attribute__((unused)) = f())
printf("hello!\n");
return 0;
这会使 GCC 和 clang 的警告静音。
【讨论】:
我在错误的地方使用了__attribute__((unused))
- 在const
之前
attribute syntax 至少可以说并不是微不足道的,但根据我有限的经验,只要你坚持一个声明,把它放在你定义的名字之后似乎有效(在函数的参数列表之后)。【参考方案2】:
如果temp
未被使用,本质上它也可能不需要。删除它。
#include <cstdio>
int f() return 5;
int main()
if(f())
printf("hello!\n");
return 0;
我知道这是一个 MCVE,那么为什么一开始就需要它呢?
正如您在 cmets 中提到的,temp
的析构函数在目标代码中很重要。添加一组额外的大括号将添加对临时生命周期的控制并确保其使用(因此删除警告);
#include <iostream>
using namespace std;
struct A
~A() cout << "~A()" << endl;
explicit operator bool() const return true;
;
A f() return A;
int main()
// braced to limit scope...
auto&& a = f(); // can be const A&
if ( a )
cout << "hello!" << endl;
// braced to limit scope....
return 0;
Demo code.
鉴于 temp
的生命周期的附加约束已扩展到关联 else
的末尾,只需强制使警告静音即可(编译器受限)。
if (const int &temp __attribute__((unused)) = f())
C++11 带来了[[...]]
风格的属性,但是unused
是not standard,但是clang 确实支持这种语法[[gnu::unused]]
【讨论】:
嗯,它实际上不是一个 int,而是一个带有 ctor/dtor 的类型,我需要在 if 块的末尾执行析构函数......也许我应该给出一个完整的例子 @onqtam 它的析构函数将被执行,即使这里没有命名变量。 @songyuanyao 在if(myType())
和 if(const myType& temp = myType())
中 temp 的生命周期是不同的 - 在前者中它不会持续到 then 块的末尾(并且 const ref 将是)跨度>
Niall - 您的解决方案确实有效,但由于我的宏将仅扩展到 if 语句,因此我无法强制用户在 if 的 then 部分之后添加更多大括号。还有 c++98...
@onqtam。 SECTION()
宏是否必须在 if()/else
的末尾立即运行析构函数?如果不是,那么简单地创建一个具有随机名称(可能添加行号)的本地绑定 (const&
) 将在更大范围的末尾运行析构函数。【参考方案3】:
在不使用__attribute__((unused))
(这完全是正确的解决方案)的情况下尝试解决这个问题后,我决定这样做。
if(const int& temp = ((true) ? f() : (static_cast<void>(temp), f())) )
true
周围的括号抑制死代码警告,条件运算符在分配之前抑制有关使用 temp
的警告,并且强制转换为 void
删除未使用的变量警告。
gcc 的 -Wall
和 clang 的 -Weverything
没有什么可说的,尽管一个合理的人类可能会这样做。
公平警告:如果 temp
曾经用 volatile
复制构造函数声明为 volatile
,这将是 UB(关于何时发生左值到右值转换的一些神秘规则)。
【讨论】:
以上是关于在 if 语句中静默 -Wunused-variable的主要内容,如果未能解决你的问题,请参考以下文章