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

标签 c++ c macros preprocessor

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

#define DO_SOME_STUFF(val,x,y) \
  if (x>y) \
  { \
    val = val >> (x-y); \
  } else { \
    val = val >> (y-x); \
  }

使用扩展调用宏的示例如下:

 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 多次,到目前为止我想到的唯一解决方案是执行以下操作:

#pragma GCC diagnostic ignored "-Wshift-count-negative"
DO_SOME_STUFF(val,300,20);
#pragma GCC diagnostic pop

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

是否有一种优雅的方法来删除仅针对我的宏扩展的警告或要求编译器忽略死代码? (不幸的是,我无法将 #pragma 选项添加到我的宏定义中)。

最佳答案

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

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

关于c++ - 忽略 C/C++ 中的死代码警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48209595/

相关文章:

c# - 在 C# 中定义常量

c++ - MPI:为什么我在下一个例子中使用 MPI_Barrier 时出现错误?

c++ - 从系统表中获取节点状态

c - 读取一个文件、解析并写入另一个文件

c - 在替换文本之前使用 # 时不正确地终止宏调用

c++ - 根据 cmake 目标启用宏

c++ - 在立方体面上应用图像 - VTK

c - 在 "C"中使用数组打印数组值而不使用大括号

c - 从标准输入读取命令行参数

macros - 如何定义传递(身份或 NOP)宏?