结构化绑定和基于范围的; 在gcc中抑制未使用的警告

Per*_*-lk 10 c++ gcc unused-variables c++17 structured-bindings

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

for (auto& [unused, val] : my_map)
     do_something(val);
Run Code Online (Sandbox Code Playgroud)

我尝试过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]].
Run Code Online (Sandbox Code Playgroud)

似乎该[[maybe_unused]]属性尚未实现结构绑定.

这有什么简单的解决方案吗?任何宏,gcc/gnu扩展名,或任何暂时禁止该特定警告的pragma对我来说都没有问题; 例如,在我使用基于范围的for的整个函数体中禁用它,因为我使用它的函数非常短(它基本上是两个不同映射的两个范围,具有精确的行为).

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

-std=c++17 -Wall -Wextra -Werror -pedantic -pedantic-errors
Run Code Online (Sandbox Code Playgroud)

我目前要做的是,但这很难看:

for (auto& [unused, val] : my_map)
   (void)unused, do_something(val);
Run Code Online (Sandbox Code Playgroud)

dfr*_*fri 9

maybe_unused对于gcc 7.2.0中的结构化绑定,似乎你没有实现该属性,但是值得注意的是,它似乎是针对gcc 8.0 trunk实现的(g ++ 8.0.0 20171026 experimental).

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

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

然而,这不会:

// no warning
for ([[maybe_unused]] auto& [unused, val] : my_map) { }
Run Code Online (Sandbox Code Playgroud)

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

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

// no warning
for (auto& [unused, val] : my_map)
{
    (void)unused;
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢.很想知道在gcc-8中`[[maybe_unused]]`根本不需要(只使用其中一个是非常可能需要的;我认为这是有意的). (2认同)

Sam*_*hik 4

本页记录了相关的 GCC 编译指示。

#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);

}
Run Code Online (Sandbox Code Playgroud)

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