2012-03-24 46 views
3

声明:“内联函数必须在调用之前定义。”内联函数/方法

这句话是否正确?

[编辑]

问题是最初在德国:
直列FunktionenmüssenVOR ihrem Aufruf definiert盛。

也许它可以帮助任何人......

+2

有人不做作业 – Rps 2012-03-24 16:29:31

+0

我是,但它是在测试中,我仍然不知道这是否正确。 – dudade 2012-03-24 16:31:33

回答

5

是的,它是正确的,但只partly.It也许正确地重新框架如下:

“内联函数必须在每个translation unit定义(但不一定在之前),他们被称为“。

C11 ++标准:§7.1.2.4

内联函数应每翻译单元在其被使用并应 具有完全相同的定义在每种情况下被定义[注:在其定义出现在翻译单元中之前,可能会遇到对内联函数的调用。 - 注意]

为什么这个原理?

当您声明函数内联基本上您正在告诉编译器(如果可能)用调用该函数的函数的内容替换调用该函数的代码。这个想法是,函数体可能很小,调用函数比函数本身的开销更大。

为了能够做到这一点,编译器需要在编译调用函数的代码时看到定义。通常,这是通过在inline说明符中添加头中函数的定义,然后将头文件包含在要调用该函数的每个cpp文件中完成的。

+2

我在您的报价单中看不到“之前”一词,或者任何等价物。 – 2012-03-24 16:28:37

+0

@DavidGrayson:好的,我明白你的意思,我编辑了一下,以便适当地反映出来。 – 2012-03-24 16:41:13

+0

+1为改进的答案。我想为内联函数添加另一个基本原理:它允许编译器优化函数的主体。有时候,如果事先知道参数的价值是什么,你可以将整个大型函数优化为几条指令。 – 2012-03-24 17:32:31

-1

该声明没有意义:内联函数不再被调用,代码仅存在于当前函数中(它已被“内联”)。所以不,我会说这是不正确的。

+1

即使编译后的代码看起来不像函数调用,仍然可以通过编写“foo()”来“调用”内联函数。看起来你只是对“呼叫”这个词进行人为严格的定义。 – 2012-03-24 16:31:29

0

编号C++11 draft n3242比7.1.2小节4中较早的规范状态更清楚;

内联函数应德音响定义在每一个翻译单元,其中 它是ODR-使用,而且必须在任何情况下 (3.2)有完全一样去音响nition。 [注意:在翻译单元中出现 其定义之前,可能会遇到对内联函数的调用。 - 尾注]