int funca(int i)
{
return i;
}
毫无疑问是必须显示的return返回,并带一个int类的值
但是如果函数为
int* funcb(int i)呢??
如果
int* funcb(int i)
{}
这样编译器会报错,必须要返回一个int*
然而如果这样
int* funcb(int i)
{
if(i > 0)
{
return new int(0);
}
}
编译居然可以通过了,为什么,如果我的i<0,那么我什么都没有return啊
跟踪汇编代码也没有发现这条路径上有任何的设置eax的动作,搞不懂啊
6 个解决方案
#1
会有警告:不是所有路径都有返回值
#2
那条不return的路径其实感觉和
int* funcb(int i)
{}
是一回事啊
那为什么一个是error,一个是warning??
int* funcb(int i)
{}
是一回事啊
那为什么一个是error,一个是warning??
#3
你的3个函数编译在G++下都是可以通过的,不同的编译器有不同的检验程度。
#4
谢谢,没有试过c++,只用了VS来尝试,还以为是标准的问题呢
#5
我的拙见,
函数声明时的返回类型指明,函数出栈后要去寄存器中取值(取出来的是return值的地址),
函数中没有return,只是没有给这个寄存器存入合法的值。
出栈后还是会去读寄存器,只是读来来的是垃圾数据。
高手莫笑。。
函数声明时的返回类型指明,函数出栈后要去寄存器中取值(取出来的是return值的地址),
函数中没有return,只是没有给这个寄存器存入合法的值。
出栈后还是会去读寄存器,只是读来来的是垃圾数据。
高手莫笑。。
#6
int main不需要
其他的都需要,否则会有警告。
其他的都需要,否则会有警告。
#1
会有警告:不是所有路径都有返回值
#2
那条不return的路径其实感觉和
int* funcb(int i)
{}
是一回事啊
那为什么一个是error,一个是warning??
int* funcb(int i)
{}
是一回事啊
那为什么一个是error,一个是warning??
#3
你的3个函数编译在G++下都是可以通过的,不同的编译器有不同的检验程度。
#4
谢谢,没有试过c++,只用了VS来尝试,还以为是标准的问题呢
#5
我的拙见,
函数声明时的返回类型指明,函数出栈后要去寄存器中取值(取出来的是return值的地址),
函数中没有return,只是没有给这个寄存器存入合法的值。
出栈后还是会去读寄存器,只是读来来的是垃圾数据。
高手莫笑。。
函数声明时的返回类型指明,函数出栈后要去寄存器中取值(取出来的是return值的地址),
函数中没有return,只是没有给这个寄存器存入合法的值。
出栈后还是会去读寄存器,只是读来来的是垃圾数据。
高手莫笑。。
#6
int main不需要
其他的都需要,否则会有警告。
其他的都需要,否则会有警告。