【问题标题】:Visual C++ error: function must return a valueVisual C++ 错误:函数必须返回一个值
【发布时间】:2012-07-08 19:41:57
【问题描述】:

我正在做一个多平台项目,有些平台禁用了一些功能,在这些功能的界面中,我经常做的事情是这样的:

bool Foo::bar() const {
    // disabled
    abort();
}

GCC/LLVM 不要求非 void 函数返回值(它们只是给出警告),在这种情况下,我调用 abort(),它们足够聪明,甚至不会给出警告(因为函数无论如何都不会回来)。

有没有办法(编译标志?)使 Visual C++ 2010 的行为方式相同,所以我不会一直破坏 Windows 构建?我知道我总是可以在中止后返回值,但是在其他平台上工作时我通常会忘记这一点,并且不给出错误的行为似乎更合适。

【问题讨论】:

  • 另一方面,当我确实包含无用的返回时,它有时会给我一个“无法访问代码”的警告......哈哈
  • 直接调用abort 似乎是一种不好的做法。为什么不使用assert(false)
  • @JurajBlaho assert(false) 将导致发布版本出现警告 (GCC/LLVM)。
  • ...根据环境,assert(FALSE) 可能会在预处理器处理完源代码后变为空操作。

标签: c++ visual-c++ unreachable-code


【解决方案1】:

__declspec(noreturn) 在 MSVC++ 编译器中应该有这个效果。我希望标准abort 被声明为__declspec(noreturn)。但是由于编译器在您的示例中生成错误,因此它可能不是这样声明的。我建议你检查abort 的声明。如果它没有__declspec(noreturn),你应该以某种方式添加它。

【讨论】:

    【解决方案2】:

    一般来说,Visual C++ 编译器允许您使用annotate a function with __declspec(noreturn) 来指示函数永远不会返回。这有助于编译器意识到调用此类函数后的任何代码都是不可访问的。

    this SO question 涵盖了您在此处遇到的问题。长话短说,abort() 在 Visual C++ 运行时标头中没有此注释。

    【讨论】:

      【解决方案3】:

      当您想禁用错误时,添加/w34716 作为编译标志(假设您使用的是警告级别 3 或更高级别) - 现在只发出警告(如果警告级别为 3 或更高级别)。您也可以禁用警告 (/wd4716),但这可能不是一个好主意 - 取决于此行为导致的警告数量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多