c++ 什么时候应该使用[[maybe_unused]]?

mwngjboj  于 12个月前  发布在  其他
关注(0)|答案(4)|浏览(255)

使用[[maybe_unused]]有什么好处?考虑

int winmain(int instance, int /*prevInstance*/, const char */*cmdline*/, int show);

int winmain(int instance, [[maybe_unused]] int prevInstance, [[maybe_unused]] const char *cmdline, int show);

有些人可能坚持认为使用注解是丑陋的,因为这个关键字是在这种情况下使用的,我完全同意,但maybe_unused关键字对我来说似乎有点太长了,使代码稍微难以阅读。
我想尽可能“严格”地遵循标准,但它值得使用吗?

up9lanfz

up9lanfz1#

如果这个参数肯定没有使用,[[maybe_unused]]就不是特别有用,未命名的参数和注解就可以了。
[[maybe_unused]]主要用于 * 潜在 * 未使用的内容,例如

void fun(int i, int j) {
    assert(i < j);
    // j not used here anymore
}

这不能用未命名的参数来处理,但如果定义了NDEBUG,将产生一个警告,因为j未使用。
当参数仅用于(可能已禁用)日志记录时,可能会发生类似的情况。

toiithl6

toiithl62#

Baum mit Augen's answer是一个明确的、无可争议的解释。我想再举一个例子,它不需要宏。具体来说,C++17引入了constexpr if构造。所以你可能会看到这样的模板代码(除了愚蠢的功能):

#include <type_traits>

template<typename T>
auto add_or_double(T t1, T t2) noexcept {
    if constexpr (std::is_same_v<T, int>)
        return t1 + t2;
    else
        return t1 * 2.0;
}

int main(){
    add_or_double(1, 2);
    add_or_double(1.0, 2.0);
}

在编写本文时,GCC 8.0.1警告我,当else分支是示例化分支时,t2未使用。在这种情况下,属性也是必不可少的。

5gfr0r5j

5gfr0r5j3#

我发现maybe_unused在您有一组常量定义一组配置常量时很有用,这些常量可能会使用,也可能不会使用,具体取决于配置。然后,您可以自由地更改配置,而不必定义新的常量和担心未使用的常量。
我主要在需要设置特定值的嵌入式代码中使用它。否则枚举通常更好。

qcuzuvrc

qcuzuvrc4#

使用它suppress compiler warnings of unused variables.您是否选择使用这种方法取决于您正在工作的团队或组织的编码标准和实践。
在某些工作场所,使用注解掉未使用的变量的方法,如下所示:

bool f (auto /*unusedVariable*/) {return false;}

这是惯例。它有效地传达了保留变量的意图,即使它看起来没有使用。
相反,在其他开发环境中,使用像宏这样的技术可能更适合解决这个问题,并保持代码库的干净,不受这些注解的影响。

bool f (auto unusedVariable) 
{
   UNUSED (unusedVariable);
   return false;
}

最终,在这些方法或任何其他方法之间做出选择,应该符合特定项目或团队的编码约定和需求。没有放之四海而皆准的答案,重要的是保持代码库的一致性。
下面是一个[[maybe_unused]]被普遍接受的例子:

#include <algorithm>
#include <iostream>
#include <vector>
 
int main()
{
   std::vector<int> v {0, 1, 2, 3 };
   
   std::cout << std::count_if (v.begin (), v.end (), [] (int i) {return (i & 1);}) << "\n";
   std::cout << std::count_if (v.begin (), v.end (), [] ([[maybe_unused]] int i) {return true;}) << "\n"; // Compiles without a warning
   std::cout << std::count_if (v.begin (), v.end (), [] (int i) {return false;}) << "\n"; // Produces a warning
}

相关问题