我正在开发一个多平台项目,有些平台已经禁用了功能,在这些功能的界面中,我常常做的是这样的事情:
bool Foo::bar() const {
// disabled
abort();
}
GCC / LLVM不要求非空函数返回值(它们只是发出警告),在这种情况下,我调用abort()
,它们足够智能甚至不发出警告(因为该函数永远不会返回。)
有没有办法(编译标志?)使Visual C ++ 2010的行为方式相同,所以我不会继续破坏Windows版本?我知道我总是可以在中止后返回值,但是当我在其他平台上工作时,我通常会忘记这一点,并且不给出错误的行为似乎更合适。
答案 0 :(得分:4)
__declspec(noreturn)
应该在MSVC ++编译器中起作用。我希望将标准abort
声明为__declspec(noreturn)
。但由于编译器在您的示例中生成错误,因此可能不会以这种方式声明。我建议您查看abort
的声明。如果它中没有__declspec(noreturn)
,你应该以某种方式添加它。
答案 1 :(得分:2)
通常,Visual C ++编译器允许您annotate a function with __declspec(noreturn)
指示函数永远不会返回。这有助于编译器实现调用此类函数后的任何代码都无法访问。
this SO question中介绍了您遇到的问题。为了使故事更短,abort()
在Visual C ++运行时标题中没有此注释。
答案 2 :(得分:1)
如果要禁用错误,请将/w34716
添加为编译标志(假设您使用警告级别3或更高级别) - 现在只发出警告(如果警告级别为3或更高)。您也可以禁用警告(/wd4716
),但这可能不是一个好主意 - 取决于此行为导致的警告数量。