【问题标题】:structured bindings and range-based-for; supress unused warning in gcc结构化绑定和基于范围的绑定;抑制 gcc 中未使用的警告
【发布时间】:2018-04-10 19:54:31
【问题描述】:

我想使用结构绑定遍历地图,忽略键:

for (auto& [unused, val] : my_map)
     do_something(val);

我用 gcc-7.2.0 尝试了不同的选项:

// The warning is issued
for ([[maybe_unused]] auto& [unused, val] : my_map)
      do_something(val);

// Syntax error
for (auto& [[[maybe_unused]] unused, val] : my_map)
      do_something(val);

// The same two combinations above with [[gnu::unused]].

似乎[[maybe_unused]] 属性尚未针对结构绑定实现。

有什么简单的解决办法吗?任何宏、gcc/gnu 扩展或任何临时禁止该特定警告的编译指示对我来说都可以;例如,在我使用 range-based-for 的整个函数体中禁用它,因为我使用的函数非常短(它基本上是两个具有精确行为的不同映射上的 range-for-loop )。

我用来编译项目的(相关)选项是:

-std=c++17 -Wall -Wextra -Werror -pedantic -pedantic-errors

我现在要做的是,但这很丑:

for (auto& [unused, val] : my_map)
   (void)unused, do_something(val);

【问题讨论】:

  • @dfri 但我不能使用std::ignore,因为它已经是一个声明的变量,而我拥有的是一个声明,所以我要引入新名称。
  • 是的,我只发布了一个相关链接,而不是重复标记(如链接中所述,目前没有与 std::ignore 等效的结构化绑定,尽管标准可能会引入一个后一点)。对链接线程中的一个答案的评论还建议使用maybe_unused 进行警告抑制(涵盖绑定中的所有声明),但我不知道这是否受支持(因为您已经测试了一些变体)基于范围的循环中结构化绑定的上下文。

标签: c++ gcc c++17 unused-variables structured-bindings


【解决方案1】:

看来你是对的,maybe_unused 属性还没有为 gcc 7.2.0 中的结构化绑定实现,但值得注意的是它似乎是为 gcc 8.0 主干实现的(g++ 8.0.0 20171026 实验性) .

使用 gcc 8.0 trunk 编译,下面会发出-Wunused-variable 警告:

// warning: unused structured binding declaration [-Wunused-variable]
for (auto& [unused, val] : my_map) { }

而这不会:

// no warning
for ([[maybe_unused]] auto& [unused, val] : my_map) { }

特别是,删除 [[maybe_unused]] 但使用至少一个有界变量也不会产生警告(有意?)。

// no warning
for (auto& [unused, val] : my_map)
{
    do_something(val);
}

// no warning
for (auto& [unused, val] : my_map)
{
    (void)unused;
}

【讨论】:

  • 谢谢。很想知道在 gcc-8 中 [[maybe_unused]] 根本不需要(很可能只使用其中一个;我认为这是有意的)。
【解决方案2】:

相关的 GCC 编译指示记录在 on this page

#include <map>

std::map<int, int> my_map;

void do_something(int);

void loop()
{
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
    for (auto & [unused, val]: my_map)
#pragma GCC diagnostic pop
        do_something(val);

}

这是我可以拥有的最小范围的禁用警告,并且仍然使用-Wall -Wextra -Werror 抑制警告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多