d******i 发帖数: 7160 | 1 至少vc对以下的烂函数很宽容,只是个编译期warning - "not all control paths
return a value"
int yy=0;
int test_func()
{
if(yy>0)
return 1;
}
而且奇怪的是它能正常运行,无疾而终。
int dd=test_func();
接受返回值的dd还是默认值,没受影响。
不理解啊。
求指点。谢谢! |
S**I 发帖数: 15689 | 2 本来就是允许的;至于你的代码,那个函数调用既然没有影响,编译器可能直接把它优
化掉了。
【在 d******i 的大作中提到】 : 至少vc对以下的烂函数很宽容,只是个编译期warning - "not all control paths : return a value" : int yy=0; : int test_func() : { : if(yy>0) : return 1; : } : 而且奇怪的是它能正常运行,无疾而终。 : int dd=test_func();
|
d******e 发帖数: 2265 | 3 现在的孩子不学习汇编和编译,所以很难理解。
这有什么不可以的。
【在 d******i 的大作中提到】 : 至少vc对以下的烂函数很宽容,只是个编译期warning - "not all control paths : return a value" : int yy=0; : int test_func() : { : if(yy>0) : return 1; : } : 而且奇怪的是它能正常运行,无疾而终。 : int dd=test_func();
|
d****n 发帖数: 1241 | 4 编译器接受了某个代码并不代表代码是正确的。
首先看看test_func()在C的abstract machine上是如何运行的,if(yy>0)是false,
所以程序会执行到 "}", 然后标准规定(n1570 6.9.1):
If the } that terminates a function is reached, and the value of the
function call is used by
the caller, the behavior is undefined.
int dd = test_func()这条语句正好符合上边的描述,所以你的代码
里存在未定义行为,C标准允许编译器做任意的事情。
【在 d******i 的大作中提到】 : 至少vc对以下的烂函数很宽容,只是个编译期warning - "not all control paths : return a value" : int yy=0; : int test_func() : { : if(yy>0) : return 1; : } : 而且奇怪的是它能正常运行,无疾而终。 : int dd=test_func();
|
Y**G 发帖数: 1089 | 5 x86上return xxx就是将xxx放到寄存器EAX。调用者看EAX来获得函数的返回值。
如果没有return语句等于执行隐含的return语句,返回值无定义,是垃圾。 |
d****n 发帖数: 1241 | 6 这个未必,因为函数是可以被内联的。
当然,因为他的代码本身是错误的,包含未定义行为,所以编译器可以做任意
的事情。。。
【在 Y**G 的大作中提到】 : x86上return xxx就是将xxx放到寄存器EAX。调用者看EAX来获得函数的返回值。 : 如果没有return语句等于执行隐含的return语句,返回值无定义,是垃圾。
|
b*******s 发帖数: 5216 | 7 除了内联,还有返回值优化
【在 d****n 的大作中提到】 : 这个未必,因为函数是可以被内联的。 : 当然,因为他的代码本身是错误的,包含未定义行为,所以编译器可以做任意 : 的事情。。。
|
d****n 发帖数: 1241 | 8 返回值优化(RVO)通常指带的是在C++编译器里的一种优化吧?在C编译器里好像没有类
似的优化.
【在 b*******s 的大作中提到】 : 除了内联,还有返回值优化
|
Y**G 发帖数: 1089 | 9 看仔细了,他的函数前面没有inline,别乱扯。
【在 d****n 的大作中提到】 : 这个未必,因为函数是可以被内联的。 : 当然,因为他的代码本身是错误的,包含未定义行为,所以编译器可以做任意 : 的事情。。。
|
d****n 发帖数: 1241 | 10 ...函数前不加inline,并不代表编译器不会inline这个函数,
类似,函数前加了inline, 并不代表编译器一定会inline这个函数,
inline只是一个hint, 不是“必须”。
【在 Y**G 的大作中提到】 : 看仔细了,他的函数前面没有inline,别乱扯。
|
Y**G 发帖数: 1089 | 11 你怎么就知道他没用noinline选项哪。说不定他用了。
【在 Y**G 的大作中提到】 : 看仔细了,他的函数前面没有inline,别乱扯。
|
d****n 发帖数: 1241 | 12 这就扯的远了,我并没有说你之前说错了,只是说未必编译器会
做你说描述的情况,也许会,也许不会。。。
【在 Y**G 的大作中提到】 : 你怎么就知道他没用noinline选项哪。说不定他用了。
|
b*******s 发帖数: 5216 | 13 嗯,cpp才有
【在 d****n 的大作中提到】 : 返回值优化(RVO)通常指带的是在C++编译器里的一种优化吧?在C编译器里好像没有类 : 似的优化.
|