警告控制到达非void函数c ++的结尾

时间:2011-07-10 14:44:37

标签: c++ warnings return-type

我在C ++代码中有以下功能(仅作为示例)

Object& XYZ::getObject(InObj obj) {
  try{ 
      return obj.getObj();
  }
  DC_THROW_ERROR(ExceptionObj, "Object Not Found");   // Macro which throws an exception
}

当我编译上面的代码时,我得到警告(即控制到达非void函数的结束)..宏在编译之前被扩展。所以编译器知道如果它没有返回它抛出异常的东西。如果是这样,为什么编译器发出警告在我的项目中,这些类型的函数都很复杂。为了摆脱这些警告,我在宏之后写下了一行。

return *(static_cast<Object*>(0)); 

这是一种正确的修复方法吗?我知道它有点狡猾..我不能改变代码,因为我必须改变大约1000个功能。那么有人可以告诉我是否有更好的方法来解决它?

由于

2 个答案:

答案 0 :(得分:3)

收听编译器。摆脱(迄今为止未公开的)宏。或者只是解决它,但最好摆脱它 - 你进入make-C ++ - 看起来像语言X的东西,这是不好的。

干杯&amp;第h。,

答案 1 :(得分:2)

假设问题中的代码是导致问题的代码的忠实表示,则宏DC_THROW_ERROR必须类似于

#define DC_THROW_ERROR(err) catch(...) {throw err;}

DC_THROW_ERROR("Object Not Found")之后的那个分号导致

Object& XYZ::getObject(InObj obj) {
  try { 
    return obj.getObj();
  }
  // This is the expansion of DC_THROW_ERROR("Object Not Found")
  catch (...) {
    throw ("Object Not Found");
  }

  ; // This is the semicolon that follows DC_THROW_ERROR("Object Not Found")

}

这是一个无关的分号,而不是宏,它使得编译器在控件中达到非空函数的末尾。也就是说,因为C和C ++中的语句应该以分号结束,所以代码的人类作者在宏调用结束后添加分号是很自然的。

你真的需要一个宏吗?宏一般都是邪恶的。这个宏是邪恶的化身。

  • 它使得try-catch块看起来像无效语法。使代码看起来无效的宏是双重的邪恶。
  • 重命名语法。做#define BEGIN {是邪恶的。重命名语法的宏是双重的邪恶。
  • 它邀请程序员在最后添加分号。不应该使用分号的宏是双重的邪恶。
  • 宏调用不应该跟分号后面显然没有记录。做恶事但不记录邪恶的宏是双重邪恶。

总而言之,这个宏是2x2x2x2,或十六倍的邪恶。这就是这个恶魔代码。