2014-09-22 84 views
4

我正在阅读关于C++中的内联函数,大部分我理解的是编译器会复制粘贴内联的函数代码。如果一个内联函数包含一个return语句,并且该函数在某个其他函数中使用,它是否会导致调用者函数终止并返回?在C++中的内联函数中返回语句是否会实际返回并终止代码流?

例如,考虑

inline int foo(void) { 
return 1; 
} 

int bar(void) { 
//Some statements 
foo() 
//Some more statements 
return 2; 
} 

将禁止前foo()bar()回报达到return 2;行,因为代码被编译器复制粘贴?否则,如何在内联函数中处理return语句?我明白,现在不会破坏代码流,但如果代码是复制粘贴或内联的,则如何处理return语句?

+6

在这种情况下,行为与内联无关。 – EdChum 2014-09-22 10:19:40

+1

不会。这意味着如果某个函数被内联,代码的行为将会发生变化,并且这会使内联变得毫无用处/危险。 – juanchopanza 2014-09-22 10:20:19

回答

7

内联函数不仅仅是一个简单的复制粘贴过程(与预处理器宏相反)。它们的行为与普通函数类似,所以任何返回值都会像调用普通函数一样反映给调用者。

+0

一些编译器可能有问题。我只是试图在类中调用静态内联int函数。 ADI编译器在调用时会产生错误。当我放弃“内联”关键字时,一切正常。 – 2016-11-03 14:31:17

+0

@Günter我怀疑它,但不知道错误是什么,我不能说你做错了什么。例如,你可能已经传递了一个函数指针,指向代码中某处的内联函数;内联函数显然没有地址,因此错误... – 2016-11-03 14:49:41

2

优化通常不会改变代码的可观察行为。在C++中,除少数情况外(浮点运算重新排序,复制elision),情况都是如此。内联函数不会改变程序的代码流。

0

认为函数好像它们是计算值的规则,而不是返回的东西。这只是一个return关键字说,如果控制到达关键字,则当前函数计算的值是关键字旁边的任何值,并且当前函数应立即退出(无条件跳转到当前函数的关闭{)。

在你的例子中,一些函数foo()被编程为返回1。如果它没有内联,那么编译器会发出代码,确实将1放在调用者希望找到它的地方,并且返回的指令返回。如果它没有内联 - 好吧,编译器在任何时候都会看到函数结果为1,并编译适当调用此函数的代码 - 无论函数结果是否被使用,它只是“插入”1。在你的例子中foo()结果没有被使用,所以编译器只是忽略结果,函数调用被编译为no-op。