【问题标题】:How to avoid warning when using scope guard?使用范围保护时如何避免警告?
【发布时间】:2016-06-05 20:28:15
【问题描述】:

我正在使用愚蠢的范围保护,它正在工作,但它会生成一个警告说该变量未使用:

warning: unused variable ‘g’ [-Wunused-variable]

代码:

folly::ScopeGuard g = folly::makeGuard([&] {close(sock);});

如何避免这样的警告?

【问题讨论】:

  • 我认为你不应该使用folly::ScopeGuard g = folly::makeGuard([&] {close(sock);});。你应该使用SCOPE_EXIT{close(sock);}。看看这是否会使警告消失。如果没有,可能有一种方法可以在定义中破解使用。
  • 什么编译器版本?如果g 的析构函数确实做了一些事情,那么编译器不应该对此发出警告,它可能被认为是一个错误(并且可能已在以后的版本中修复)。
  • 应该注意的是,C++17 似乎正在获得一个[[maybe_unused]] 属性,该属性将提供一种标准保证的方式来声明一个变量将不被使用。
  • @M.M:编译器警告此类变量并非不合理,即使它们具有执行某些操作的析构函数。如果你只是声明了一个std::string 并且不小心忘记使用它,编译器仍然应该警告它,因为你几乎肯定是想对它做些什么。
  • @NicolBolas 公平点

标签: c++ c++11 scopeguard folly


【解决方案1】:

您可以将变量标记为未使用:

folly::ScopeGuard g [[gnu::unused]] = folly::makeGuard([&] {close(sock);});

或将其转换为 void:

folly::ScopeGuard g = folly::makeGuard([&] {close(sock);});
(void)g;

两者都不是很好,imo,但至少这可以让您保留警告。

【讨论】:

    【解决方案2】:

    您可以通过-Wno-unused-variable 禁用此警告,但这有点危险(您会丢失所有真正未使用的变量)。

    一种可能的解决方案是实际使用该变量,但不对其进行任何操作。例如,将其设为 void:

    (void) g;
    

    可以做成宏:

    #define IGNORE_UNUSED(x) (void) x;
    

    或者,您可以使用boost aproach:声明一个什么都不做的模板函数并使用它

    template <typename T>
    void ignore_unused (T const &) { }
    
    ...
    
    folly::ScopeGuard g = folly::makeGuard([&] {close(sock);});
    ignore_unused(g);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-21
      • 2016-12-25
      • 2021-02-04
      • 1970-01-01
      • 1970-01-01
      • 2020-09-05
      • 2014-08-31
      • 2017-08-17
      相关资源
      最近更新 更多