在 if 语句中沉默 -Wunused-variable
Silencing -Wunused-variable in an if statement
以下代码生成一个警告,指出 temp
未被使用(这是真的):
#include <cstdio>
int f() { return 5; }
int main() {
if(const int& temp = f()) {
printf("hello!\n");
}
return 0;
}
问题是我 需要 这样做而不用 gcc -Wall
和 clang -Weverything
生成警告(我正在实现类似的功能Catch) 的 SECTION()
内容。
那么有什么方法可以让它静音吗?我尝试使用 __attribute__((unused))
.
全局使用 -Wno-unused-variable
对我来说不是一个选项,因为我正在编写一个仅 header 的库。
#include <cstdio>
int f() { return 5; }
int main()
{
if (const int &temp __attribute__((unused)) = f()) {
printf("hello!\n");
}
return 0;
}
这会消除 GCC 和 clang 的警告。
如果temp
没有被使用,本质上也可能不需要。删除它。
#include <cstdio>
int f() { return 5; }
int main() {
if(f()) {
printf("hello!\n");
}
return 0;
}
我知道这是一个 MCVE,那么为什么它首先需要在那里?
正如您在评论中提到的,temp
的析构函数在目标代码 中很重要。添加一组额外的大括号将增加对临时生命周期的控制并确保其使用(因此删除警告);
#include <iostream>
using namespace std;
struct A {
~A() { cout << "~A()" << endl; }
explicit operator bool() const { return true; }
};
A f() { return A{}; }
int main() {
{ // braced to limit scope...
auto&& a = f(); // can be const A&
if ( a ) {
cout << "hello!" << endl;
}
} // braced to limit scope....
return 0;
}
考虑到 temp
生命周期的附加限制已延长到关联 else
的末尾,只需强制关闭警告即可(编译器受限)。
if (const int &temp __attribute__((unused)) = f())
C++11 带来了 [[...]]
风格的属性,但是 unused
是 not standard, but clang does support this syntax [[gnu::unused]]
在尝试不使用 __attribute__((unused))
(这是完全正确的解决方案)的情况下尝试解决这个问题后,我决定采用这个方法。
if(const int& temp = ((true) ? f() : (static_cast<void>(temp), f())) )
true
周围的括号抑制死代码警告,条件运算符在分配之前抑制关于使用 temp
的警告,并且转换为 void
删除未使用的变量警告。
gcc 的 -Wall
和 clang 的 -Weverything
没有什么可说的,尽管一个合理的人可能会。
公平警告:如果 temp
曾经用 volatile
复制构造函数声明 volatile
,这将是 UB(关于何时发生左值到右值转换的一些神秘规则)。
以下代码生成一个警告,指出 temp
未被使用(这是真的):
#include <cstdio>
int f() { return 5; }
int main() {
if(const int& temp = f()) {
printf("hello!\n");
}
return 0;
}
问题是我 需要 这样做而不用 gcc -Wall
和 clang -Weverything
生成警告(我正在实现类似的功能Catch) 的 SECTION()
内容。
那么有什么方法可以让它静音吗?我尝试使用 __attribute__((unused))
.
全局使用 -Wno-unused-variable
对我来说不是一个选项,因为我正在编写一个仅 header 的库。
#include <cstdio>
int f() { return 5; }
int main()
{
if (const int &temp __attribute__((unused)) = f()) {
printf("hello!\n");
}
return 0;
}
这会消除 GCC 和 clang 的警告。
如果temp
没有被使用,本质上也可能不需要。删除它。
#include <cstdio>
int f() { return 5; }
int main() {
if(f()) {
printf("hello!\n");
}
return 0;
}
我知道这是一个 MCVE,那么为什么它首先需要在那里?
正如您在评论中提到的,temp
的析构函数在目标代码 中很重要。添加一组额外的大括号将增加对临时生命周期的控制并确保其使用(因此删除警告);
#include <iostream>
using namespace std;
struct A {
~A() { cout << "~A()" << endl; }
explicit operator bool() const { return true; }
};
A f() { return A{}; }
int main() {
{ // braced to limit scope...
auto&& a = f(); // can be const A&
if ( a ) {
cout << "hello!" << endl;
}
} // braced to limit scope....
return 0;
}
考虑到 temp
生命周期的附加限制已延长到关联 else
的末尾,只需强制关闭警告即可(编译器受限)。
if (const int &temp __attribute__((unused)) = f())
C++11 带来了 [[...]]
风格的属性,但是 unused
是 not standard, but clang does support this syntax [[gnu::unused]]
在尝试不使用 __attribute__((unused))
(这是完全正确的解决方案)的情况下尝试解决这个问题后,我决定采用这个方法。
if(const int& temp = ((true) ? f() : (static_cast<void>(temp), f())) )
true
周围的括号抑制死代码警告,条件运算符在分配之前抑制关于使用 temp
的警告,并且转换为 void
删除未使用的变量警告。
gcc 的 -Wall
和 clang 的 -Weverything
没有什么可说的,尽管一个合理的人可能会。
公平警告:如果 temp
曾经用 volatile
复制构造函数声明 volatile
,这将是 UB(关于何时发生左值到右值转换的一些神秘规则)。