5

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

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

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

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

4

3 回答 3

4

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

于 2012-07-08T19:50:18.930 回答
2

通常,Visual C++ 编译器允许您对函数进行注释,__declspec(noreturn)以表明该函数永远不会返回。这有助于编译器意识到调用此类函数后的任何代码都是不可访问的。

您在这里遇到的问题包含在这个 SO question中。长话短说,abort()Visual C++ 运行时标头中没有此注释。

于 2012-07-08T19:50:44.790 回答
1

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

于 2012-07-08T20:02:20.320 回答