gpt4 book ai didi

c++ - 编译器如何处理内联导出函数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:13:50 25 4
gpt4 key购买 nike

如果头文件包含一个函数定义,它可以被编译器内联。如果函数被导出,函数的名称和实现也必须在链接期间对客户端可用。编译器如何实现这一点?它是否既内联函数又为外部调用者提供实现?

考虑 Foo.h:

class Foo
{
int bar() { return 1; }
};

Foo::bar 在库 foo.so 中可能是内联的,也可能不是。如果另一段代码包含 Foo.h,它是否总是创建自己的 Foo::bar 拷贝,无论是否内联?

最佳答案

头文件只是复制粘贴到源文件中——这就是#include 所做的一切。一个函数只有在使用该关键字声明或在类定义中定义时才是inline,而inline只是一个提示;它不会强制编译器生成不同的代码,也不会禁止您做任何本来可以做的事情。

您仍然可以获取 inline 函数的地址,或者如您所述,导出它。对于这些用途,编译器只是将其视为非 内联 并使用 One Definition Rule (规则说用户不能将两个定义应用于同一个函数、类等)以“确保”函数被定义一次并且只导出一个拷贝。通常您只能在所有来源中拥有一个定义;一个内联函数必须有一个定义,该定义在它使用的每个源中都被精确地重复。

以下是标准对 inline extern 函数 (7.1.2/4) 的规定:

An inline function shall be defined in every translation unit in which it is used and shall have exactly the same definition in every case (3.2). [Note: a call to the inline function may be encountered before its defi- nition appears in the translation unit. ] If a function with external linkage is declared inline in one transla- tion unit, it shall be declared inline in all translation units in which it appears; no diagnostic is required. An inline function with external linkage shall have the same address in all translation units. A static local variable in an extern inline function always refers to the same object. A string literal in an extern inline function is the same object in different translation units.

关于c++ - 编译器如何处理内联导出函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2138110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com