【问题标题】:Inline Functions/Methods内联函数/方法
【发布时间】:2012-03-24 16:23:37
【问题描述】:

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

这个说法正确吗?

[编辑]

问题的原文是德语:
Inline-Funktionen müssen vor ihrem Aufruf definiert sein。

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

【问题讨论】:

  • 有人没有做作业
  • 我是,但正在测试中,我仍然无法确定这是否正确。

标签: c++ inline-functions


【解决方案1】:

是的,它是正确的,但只是部分正确。它可能正确地重新构图如下:

“内联函数必须在调用它们的每个 translation unit(但不一定在之前)中定义。”

C11++ 标准:§7.1.2.4

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

为什么会有这个理由?

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

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

【讨论】:

  • 我在你的引文中没有看到“之前”这个词,或者任何类似的词。
  • @DavidGrayson:好的,我明白你要表达的意思,我进行了编辑以适当地反映它。
  • +1 以获得改进的答案。我想为内联函数添加另一个基本原理:它允许编译器优化函数体。如果您事先知道参数的值是什么,有时您可以将整个大型函数优化为几条指令。
【解决方案2】:

没有。 C++11 draft n3242 比 7.1.2 第 4 小节中的早期规范更清楚;

应在每个翻译单元中定义内联函数 它是 odr-used 并且在每种情况下都应具有完全相同的定义 (3.2)。 [ 注意:之前可能会遇到对内联函数的调用 它的定义出现在翻译单元中。 ——尾注]

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 即使编译后的代码看起来不像函数调用,您仍然可以通过编写“foo()”来“调用”内联函数。看来您只是在人为地对“呼叫”一词进行严格的定义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 2020-06-02
    • 1970-01-01
    • 2011-01-08
    相关资源
    最近更新 更多