首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >忽略C/ C++中的死代码警告

忽略C/ C++中的死代码警告
EN

Stack Overflow用户
提问于 2018-01-11 22:38:37
回答 1查看 378关注 0票数 0

具有以下代码(大大简化):

代码语言:javascript
运行
复制
#define DO_SOME_STUFF(val,x,y) \
  if (x>y) \
  { \
    val = val >> (x-y); \
  } else { \
    val = val >> (y-x); \
  }

调用带有展开的宏的示例如下:

代码语言:javascript
运行
复制
 int val = 5;
 DO_SOME_STUFF(val,5,10);
 => 
 if (5>10)
 {
   // dead code
   val = val >> (5-10); // negative shift warning here
 } else {
   // live code
   val = val >> (10-5); // valid code
 }

现在,由于有死代码,它将被编译器删除,每个人都会很高兴,因为我永远不会负移位-所以我在这里做合法的事情。

不幸的是,我在代码被移除之前就收到了警告(至少看起来是这样)。

在我正在工作的项目中,这个函数将被称为100+次,到目前为止,我想出的唯一解决方案是执行以下操作:

代码语言:javascript
运行
复制
#pragma GCC diagnostic ignored "-Wshift-count-negative"
DO_SOME_STUFF(val,300,20);
#pragma GCC diagnostic pop

这不是很好,因为我将添加一大堆这样的代码,这将导致难以阅读的蓝色代码,如果可能的话,我宁愿避免它。

有没有一种优雅的方法可以删除警告,或者让编译器忽略死代码?(不幸的是,我不能将#杂注选项添加到我的宏定义中)。

EN

回答 1

Stack Overflow用户

发布于 2018-01-11 22:46:16

在c++11中,您可以使用模板constexpr函数而不是宏。然后,它可以在编译期间执行,并且不会产生警告。

代码语言:javascript
运行
复制
template <typename T, typename T2>
constexpr T do_some_stuff(const T& val, const T2& x, const T2& y)
{  
  return x > y ? val >> (x - y) : val >> (y - x);
}

template <typename T, typename T2>
constexpr T do_some_stuff_wrong(const T& val, const T2& x, const T2& y)
{  
  return x < y ? val >> (x - y) : val >> (y - x);
}

int main() 
{
    constexpr int val = do_some_stuff(5, 5, 10); // no warning
    constexpr int val2 = do_some_stuff_wrong(5, 5, 10); // warning
}

Live example

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48209595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档