我不太明白函数本身上的[[maybe_unused]]什么时候会有用。
通过读取论文,它只表示该属性可以应用于函数的声明。我的问题是,如果它意味着编译器会对未使用的函数发出警告,那么对于库的任何公共标题,所有东西都应该具有避免警告的属性,因为用户可能只使用库的一部分。
我的理解正确吗?
谢谢。
发布于 2022-08-16 08:02:30
受这里启发
namespace {
[[maybe_unused]] void foo() {}
void bar() {}
}
int main() {}在未命名命名空间中声明的函数只能在此转换单元中使用,因此编译器可以在不使用函数时发出警告。的确,gcc警告bar (错误是因为-Wall -Werror),但警告是[[maybe_unused]],而不是foo:
<source>:5:10: error: 'void {anonymous}::bar()' defined but not used [-Werror=unused-function]
5 | void bar() {}
| ^~~上面链接的页面中的原始示例更有启发性,因为它使用条件编译,根据设置的某些符号使用或不使用函数。
发布于 2022-08-16 08:03:37
编译器警告它可以判断是未使用的函数。如果它不确定--如果您的函数最终位于其他人可以调用它的地方,比如在库中--编译器将假定它已被使用。
例如,如果您有一个具有这些函数的翻译单元(参考):
int square(int num) {
return num * num;
}
static int cube(int num) {
return num * num * num;
}square可以由其他翻译单位的其他函数调用。它在这里不使用,但可能在其他地方使用。编译器不知道其他地方,所以它不能将函数标记为未使用的。没有警告;添加属性没有任何效果。
另一方面,cube是static,所以如果它在任何地方使用,它必须在这个翻译单元中。因为这里没有使用它,所以编译器(至少是gcc和-Wunused-function)会对此发出警告。
将[[maybe_unused]]添加到cube中,然后沉默该警告。它基本上是说:“我知道你知道这是未使用的,不要警告它。”
https://stackoverflow.com/questions/73370550
复制相似问题