由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - C编译器为何允许一个函数在某个路径不返回值?
相关主题
C++方法全都内联有什么坏处?c++中的inline 函数是做什么的?
inline functions in C++以下两个C 代码是不是完全等价?
c++ inline问题 (转载)关于函数返回值的问题
请问C++返回值和返回引用区别问个template
inline function是否可以递归?问一下,DLL里面怎么调用外部类啊?
刚看完类这一章,有些大小问题,请指教,谢谢C++ software engineer 3 years expectation
C++11的lambda不会破坏可读性吗?请教大虾们一个C++返回值问题
在看the effective C++languageoperator++ 返回值问题
相关话题的讨论汇总
话题: 编译器话题: 函数话题: 返回值话题: func话题: int
进入Programming版参与讨论
1 (共1页)
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编译器里好像没有类
: 似的优化.

1 (共1页)
进入Programming版参与讨论
相关主题
operator++ 返回值问题inline function是否可以递归?
师傅们都出来看看吧,我也问个C++返回值问题。刚看完类这一章,有些大小问题,请指教,谢谢
C++的exception大家常用吗?C++11的lambda不会破坏可读性吗?
python里的 lambda函数 有什么有点在看the effective C++language
C++方法全都内联有什么坏处?c++中的inline 函数是做什么的?
inline functions in C++以下两个C 代码是不是完全等价?
c++ inline问题 (转载)关于函数返回值的问题
请问C++返回值和返回引用区别问个template
相关话题的讨论汇总
话题: 编译器话题: 函数话题: 返回值话题: func话题: int