我有第三方库代码段,其结构如下:
class A;
A func()
{
if(...)
{
return A(...);
}
else if(...)
{
return A(...);
}
else
{
LOG(...);
}
}
它给出错误"控制可能达到非空函数的结束"在Xcode中。
同一段在VS2012中编译没有任何问题。 Xcode c ++编译器方言和标准库设置为C ++ 89和libstdc ++。我知道这是一种预期的行为,但是vs2012编译器的行为是否符合标准?
答案 0 :(得分:3)
撰写类似
的内容时Type func()
{
...
}
编译器希望您在函数的每个路径中返回Type
类型的对象,这不是您在此处所做的。
或者你的LOG
函数返回一个A
对象,我怀疑,你应该写return LOG()
,或者你的LOG
只是关于记录,你应该返回{ {1}},A
,抛出异常或您需要的任何内容,但如果没有返回任何内容,则不会到达函数的末尾。
我不知道为什么null
编译,而恕我直言,它应该不会,但即使它确实如此,也不要写这样的代码,稍后你的项目会有一些惊喜。
答案 1 :(得分:2)
在功能的这一部分
else
{
LOG(...);
}
虽然函数被声明为具有非空的返回类型,但它不向调用者返回任何内容。
我不知道,但你应该写
else
{
return LOG(...);
}
或添加一个带有return的语句
else
{
LOG(...);
return some_value;
}
答案 2 :(得分:0)
作为一个转变,我通过在LOG(...)之后返回一些虚拟对象解决了这个问题:
A func()
{
if(...)
{
return A(...);
}
else if(...)
{
return A(...);
}
else
{
LOG(...);
return A(...);
}
}