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) )
如果我的ifBIT(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; }