如何在 g++ 中抑制“左移计数 >= 类型宽度”警告

How to suppress ' left shift count >= width of type' warning in g++

(我的问题与基本相同,但我的需求不同,因此我需要不同的解决方案。)

我正在尝试使用测试驱动开发,并且正在编写一组测试来验证我的 BIT(n) 宏的行为:

#define BIT(n) ( ((uint64_t)1) << (n) )

由于我的上述测试包括预期通过和预期失败的组件,我故意做坏事,例如

MY_TEST_ASSERT(0 == (value64 = BIT(65)));

如果 BIT(n) 我的实现有问题,会输出一些有用的东西,比如

TEST FAILED: '0 == (value64 = BIT(65))' (file 'tests/002.bit-hackery.cpp', line 12))

一切都按预期工作,但我在编译过程中收到一个烦人的警告:

../../inc/bit-hackery.hpp:15:32: warning: left shift count >= width of type [enabled by default]

(这实际上很烦人有两个原因:(1)我想在这个测试代码中抑制它,因为我是故意测试这种情况的,(2)在真实(非测试)代码中,我会而是将其视为错误。但是,这个问题是关于前者的。)

我试过用 #pragma 指令抑制它,但我似乎找不到有效的指令:

#pragma GCC diagnostic push
//#pragma GCC diagnostic ignored "-Wcomparison-fixed"
//#pragma GCC diagnostic ignored "-Wtype-limits"
//#pragma GCC diagnostic ignored "-Wextra"
//#pragma GCC diagnostic ignored "-Wall"
  MY_TEST_ASSERT(0 != (value64 = BIT(65)));
#pragma GCC diagnostic pop

有谁知道如何抑制这个特定的警告?

我的编译器版本是g++ (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4

不幸的是,g++ v4.8.x 没有禁用该特定警告的标志。

您可以指示 GCC/G++ 通过-fdiagnostics-show-option 标志。

在特定情况下,不显示 -W 选项。

对于较新版本的 G++/CLANG++,您有 -Wshift-count-overflow 标志。

我认为没有办法在几行代码中禁用所有 g++ 警告(例如 How to disable all warnings in g++ on a few lines of code)。

-w 标志将禁用整个文件的所有警告,但它过多了。


PS BIT 的内联函数版本不会触发警告:

std::uint64_t BIT(std::uint64_t n) { return UINT64_C(1) << n; }

避免编译时警告的一种方法是首先将数字 65 分配给一个变量,然后将该变量传递给宏。这对编译器隐藏了问题,使其成为 运行 时间问题,这正是您想要的。事实上,无论如何您都应该对所有测试用例执行此操作,因为编译器可以选择在传递常量时简化宏和内联函数的结果代码。