在if语句中沉默-Wunused-variable

时间:2016-02-23 07:00:18

标签: c++ warnings compiler-warnings suppress-warnings

以下代码生成警告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))对我来说不是一个选项,因为我正在编写一个仅限标题的库。

3 个答案:

答案 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

Demo code

鉴于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(关于何时发生左值转换的一些神秘规则)。