2

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

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

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

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

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

如果我的实现有问题 if 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

4

2 回答 2

1

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

您可以指示 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; }
于 2016-02-15T09:53:13.983 回答
1

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

于 2016-06-30T15:52:36.817 回答