繁体   English   中英

如何在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) ,则会输出类似

测试失败:'0 ==(value64 = BIT(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++ (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4

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

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

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

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

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

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


PS BIT的内联功能版本不会触发警告:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM