c++ - 静态库。导入和导出内联函数

标签 c++ linker static-libraries inline

这个问题是在我实现我的静态库时出现的。
我想检查我的猜测并获取有关在静态库中使用内联函数的信息

  • 我的猜测是静态库的实现者不能在他的库中导出内联函数
    由于内联语句是 由编译器实现(由编译器决定是否制作 函数内联)通过放置代表 函数体中的操作到代码段,以便 操作不会放在导出/导入表中, 因此不能被链接器处理,因此不能被 图书馆员将静态库包含到应用程序代码中 被附上。我的逻辑对吗?

  • 我想导入函数作为内联是允许的,但我想知道它是如何实现的,因为它是编译器的 责任,但在链接状态下只有图书管理员,所以 这意味着它必须采取一些行动才能使 函数内联。

最佳答案

  1. 是的,内联函数通常放在 header 中,因此函数体在使用该函数的任何地方对编译器都是直接可见的。这让编译器可以评估是否为任何特定实例中的函数生成内联代码。

  2. 这基本上不会出现——“内联函数应在每个使用它的翻译单元中定义。” (§3.2/3)。这意味着如果编译器要生成内联函数,进入库的是目标代码,包括该函数代码的内联扩展。由于函数可能不会在每次使用时都内联扩展,因此库中通常也会有函数的定义,但该定义将(至少主要)像普通函数一样使用,而不是内联扩展。

链接器也可以生成代码。无论函数是不是语言标准的 inline 函数,并且是在与其使用的翻译单元相同或不同的翻译单元中定义的,链接器都可以生成不管怎样,它的内联代码。

长话短说,inline 关键字对典型编译器的影响很小或没有影响,就函数代码是否内联生成而言。主要(如果不是唯一)影响是它改变了单一定义规则——内联意味着同一函数的多个(相同)定义可以存在而不会导致问题。

关于c++ - 静态库。导入和导出内联函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15159561/

相关文章:

c++ - 虚拟调度实现细节

c++ - 将 vector 作为范围传递给 std::sort - C++17

c++ - 从函数 C++/SFML 加载资源时出现问题

c++ - 我如何剥离 Qt 库以删除我的应用程序未使用的内容?

c++ - 静态链接库是否需要链接到它们的依赖项?

c++ - 是否可以编译具有在编译时无法解析的外部依赖项的静态库?

c++ - 谁能向我解释为什么 sizeof 函数在下面的代码中返回不同的值?

java - 数组的排列

c++ - 设置 eclipse 链接器以编译和运行 GLFW 应用程序 - 如何?

c++ - 在 C++ 中使用 pthread