如何在 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 分配给一个变量,然后将该变量传递给宏。这对编译器隐藏了问题,使其成为 运行 时间问题,这正是您想要的。事实上,无论如何您都应该对所有测试用例执行此操作,因为编译器可以选择在传递常量时简化宏和内联函数的结果代码。
(我的问题与
我正在尝试使用测试驱动开发,并且正在编写一组测试来验证我的 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 分配给一个变量,然后将该变量传递给宏。这对编译器隐藏了问题,使其成为 运行 时间问题,这正是您想要的。事实上,无论如何您都应该对所有测试用例执行此操作,因为编译器可以选择在传递常量时简化宏和内联函数的结果代码。