代码之家  ›  专栏  ›  技术社区  ›  Flash

C++中的内联函数

c++
  •  4
  • Flash  · 技术社区  · 16 年前

    HII

    我是C++初学者。我确实读过关于内联函数的文章,并正确理解了它们。但是 this 网站说:“如果我们在一个.cpp文件中写入内联函数的定义并从另一个文件调用它,我们会得到一个‘未解决的外部’错误……为什么会这样……? 这可以为正常的功能做对…如果我错了请纠正我…

    谢谢

    2 回复  |  直到 16 年前
        1
  •  11
  •   CB Bailey    16 年前

    这是语言要求。 inline 意味着你 可以 在多个翻译单元中定义函数,但定义必须相同,并且 必须 在每个使用该函数的翻译单元中都有一个定义。

    这些就是规则。规则 允许 (但不需要)编译器扩展 内联的 在每个调用站点上执行函数,并忽略发出可调用函数版本。

    这和非- 内联的 只能在所有翻译单元中定义一次的函数。这是通常的“一个定义规则”,它适用于C++中的大多数实体。

    内联的 不会改变函数的链接。 内联的 默认情况下,函数具有外部链接,因此如果使用 static 变量内部 内联的 函数实现必须确保程序中只有该变量的一个副本。

        2
  •  1
  •   EboMike    16 年前

    请记住,编译器以文件为基础进行操作,即它将每个.cpp文件视为自己的离散单元。它们之间没有任何联系(当然除了对链接器粘合在一起的其他函数和变量的引用)。

    如果您内联了某个东西,并且编译器决定使用这个词(记住inline是一个提示,这意味着编译器可以选择忽略您),那么它将把函数嵌入到调用它的其他块的代码中,这样就没有函数可以让链接器指向其他.cpp文件2。

    举个例子:

    文件ACPP:

    void func1() {
      // code...
    }
    

    这将创建一个对象文件(如a.obj),其中包含func1的代码,其他人可以这样调用它。链接器将能够告诉其他.cpp文件转到那里。

    文件B.CPP:

    void func2() {
      func1();
    }
    

    这将创建包含func2的b.obj,并对func1进行函数调用。代码不知道func1是做什么的,它只是在这里有一个分支,并要求链接器在编译完所有内容后放入正确的地址。

    这很好,但是如果a.cpp只有一个inlined版本的func1,那么链接器就没有什么可以给func2()的了。