在 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&amp; 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&amp; temp = myType()) 中 temp 的生命周期是不同的 - 在前者中它不会持续到 then 块的末尾(并且 const ref 将是)跨度> Niall - 您的解决方案确实有效,但由于我的宏将仅扩展到 if 语句,因此我无法强制用户在 if 的 then 部分之后添加更多大括号。还有 c++98... @onqtam。 SECTION() 宏是否必须在 if()/else 的末尾立即运行析构函数?如果不是,那么简单地创建一个具有随机名称(可能添加行号)的本地绑定 (const&amp;) 将在更大范围的末尾运行析构函数。【参考方案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的主要内容,如果未能解决你的问题,请参考以下文章

CREATE TABLE 语句在 executeBatch 下静默失败

程序似乎在 for 循环后静默终止 - C++

授权后未立即调用时,facebook对话框静默失败

在shell脚本中调用sql语句

静默模式下的sqlplus不是静默的

C语言中三个if语句的嵌套怎理解