【问题标题】:WARNING Control reaches end of non-void function c++警告控制到达非无效函数c ++的末尾
【发布时间】:2011-07-10 14:44:37
【问题描述】:

我在 C++ 代码中有以下函数(这只是一个例子)

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

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

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

这是修复它的正确方法吗?我知道它有点狡猾。我无法更改代码,因为我必须更改大约 1000 个函数。那么谁能告诉我是否有更好的修复方法?

谢谢

【问题讨论】:

  • 能否提供宏的定义?
  • OT:我想知道为什么你可以从声明为返回 Object&amp; 的函数中返回 Object* ...
  • 请根据 Oli 提供宏的定义,以及您使用的编译器。
  • @David:什么?不存在 NULL 引用之类的东西。取消引用 NULL 是 UB。此外,在 Martin 发布时,他确实返回了一个 Object*。
  • 不,没有。引用是对象的别名。产生未定义行为的不是“创造一个”。它取消引用 NULL 指针。你永远不会“创造一个”。这里没有要被引用别名的对象。

标签: c++ warnings return-type


【解决方案1】:

听编译器。摆脱(到目前为止未公开的)宏。或者只是修复它,但最好摆脱它——你陷入了 make-C++-look-like-language-X 的东西,这是不好的。

干杯,

【讨论】:

    【解决方案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")
    

    }

    正是那个无关的分号,而不是宏,让编译器对控制到达非 void 函数的末尾感到头晕目眩。也就是说,由于 C 和 C++ 中的语句应该以分号结尾,因此代码的人类作者很自然会在宏调用结束后添加分号。

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

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

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

    【讨论】:

    • 嗨,大卫.. 奇怪的是宏没有捕获任何异常.. 反过来,它抛出了一个从传递的特定异常对象创建的通用异常.. 不确定这是否正确。这些宏到处都是..所以我不能改变一切..只是试图修复警告..
    • @user:该宏以catch 开头,或者您的编译器无效。 try 块必须后跟至少一个 catch。假设您使用的是兼容的编译器,我冒险猜测宏的外观。 显示宏。奥利从一开始就要求你这样做。现在我再次问你。
    猜你喜欢
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 2011-01-27
    • 2022-12-17
    • 1970-01-01
    • 2013-04-02
    • 2012-10-24
    • 1970-01-01
    相关资源
    最近更新 更多