C++ 如何抑制';左移计数>;=类型的宽度';g+中的警告+;

C++ 如何抑制';左移计数>;=类型的宽度';g+中的警告+;,c++,warnings,bit-shift,pragma,gcc4.8,C++,Warnings,Bit Shift,Pragma,Gcc4.8,(我的问题基本上与相同,但我的需求不同,因此我需要不同的解决方案。) 我正在尝试使用测试驱动开发,并且正在编写一组测试来验证我的位(n)宏的行为: #define BIT(n) ( ((uint64_t)1) << (n) ) 如果我的ifBIT(n)实现有问题,它会输出一些有用的东西,比如 测试失败:“0==(value64=位(65))”(文件“tests/002.BIT hackery.cpp”,第12行) 一切正常,但在编译过程中我收到了一个恼人的警告: ../../inc

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

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

#define BIT(n) ( ((uint64_t)1) << (n) )
如果我的if
BIT(n)
实现有问题,它会输出一些有用的东西,比如

测试失败:“0==(value64=位(65))”(文件“tests/002.BIT hackery.cpp”,第12行)

一切正常,但在编译过程中我收到了一个恼人的警告:

../../inc/bit hackery.hpp:15:32:警告:左移位计数>=的宽度 类型[默认启用]

(实际上,这很烦人,原因有两个:(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++(ubuntu4.8.4-2ubuntu1~14.04.1)4.8.4

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

您可以通过
-fdiagnostics show option
标志指示GCC/G++指示哪个命令行选项直接控制发出的每个诊断(,如果诊断系统知道该选项)

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

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

我认为没有办法在几行代码(例如)上禁用所有g++警告

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


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

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

std::uint64_t位(std::uint64_t n){返回uint64_C(1)避免编译时警告的一种方法是,首先将数字65分配给变量,然后将变量传递给宏。这会对编译器隐藏问题,使其成为运行时问题,这正是您想要的。事实上,您可能无论如何都应该对所有测试用例执行此操作,因为编译器可以选择简化r当传递常量时,为宏和内联函数使用代码。

谢谢,我也很欣赏内联避免这种情况的技巧……尽管至少在使用此编译器时,内联版本在使用-O0(用于调试构建)编译时会产生错误的位(65)结果而不是-O2…而宏版本是一贯正确的。值得指出的是,按操作数的宽度移位是未定义的行为。它不是实现定义的。此代码测试编译器,而不是其他。它调用未定义的行为,并假设编译器对其做了什么。我不认为这是r对于单元测试来说,包含无效的C++代码是很容易的。
std::uint64_t BIT(std::uint64_t n) { return UINT64_C(1) << n; }