以下代码生成警告temp
未使用(这是真的):
#include <cstdio>
int f() { return 5; }
int main() {
if(const int& temp = f()) {
printf("hello!\n");
}
return 0;
}
问题是我需要这样做而没有使用gcc -Wall
和clang -Weverything
生成警告(我正在实现类似{{1}的功能} Catch的东西。
那么有什么方法可以让它沉默吗?我尝试使用SECTION()
。
全局使用__attribute__((unused))
对我来说不是一个选项,因为我正在编写一个仅限标题的库。
答案 0 :(得分:3)
#include <cstdio>
int f() { return 5; }
int main()
{
if (const int &temp __attribute__((unused)) = f()) {
printf("hello!\n");
}
return 0;
}
这使GCC和铿锵声的警告无声。
答案 1 :(得分:2)
如果temp
未使用,实质上也可能不需要#include <cstdio>
int f() { return 5; }
int main() {
if(f()) {
printf("hello!\n");
}
return 0;
}
。删除它。
temp
我意识到这是一个MCVE,所以为什么它首先需要在那里?
正如您在评论中提到的那样, #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
属性样式,但-(UICollectionViewCell*)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^(void) {
UIImage *image = [[UIImage imageWithCGImage:[list objectAtIndex:indexpath.row] thumbnailImage]];
dispatch_sync(dispatch_get_main_queue(), ^(void) {
cell.imageView.image = image;
});
});
return cell;
}
为not standard,但clang确实支持此语法[[gnu::unused]]
答案 2 :(得分:1)
在跳过箍试图解决这个问题而不使用__attribute__((unused))
(这完全是正确的解决方案)之后,我决定这个。
if(const int& temp = ((true) ? f() : (static_cast<void>(temp), f())) )
围绕true
的括号抑制死代码警告,条件运算符在分配之前禁止使用temp
的警告,并且转换为void
删除未使用的变量警告。
gcc的-Wall
和clang的-Weverything
没有什么可说的,尽管人类可能会合理。
公平警告:如果temp
曾被volatile
复制构造函数声明为volatile
,那么这将是UB(关于何时发生左值转换的一些神秘规则)。