静态库.导入和导出内联函数

Static libraries. Importing and exporting inline functions

本文关键字:函数 导入 静态      更新时间:2023-10-16

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

  • 我的猜测是静态库的实现器不能导出其库中的内联函数
    由于内联语句是由编译器实现(由编译器决定是否使该函数内联)通过放置低级命令表示操作在函数体中的代码段,使操作不会放在导出/导入和因此不能被链接器处理,因此不能由图书管理员所包含的代码将静态库应用到其中附呈。我的逻辑对吗?

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

  1. 是的,内联函数通常放在头文件中,所以无论在哪里使用函数,编译器都可以直接看到函数体。这允许编译器评估是否在任何特定实例中为函数生成内联代码。

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

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

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

你理解关键字inline吗-你可以同样使用replace

内联函数允许编译时选择用实际代码替换函数调用——不需要导出/导入。它在头文件中定义。任何使用目标代码的代码都需要头代码,因此编译器将用实际代码替换函数调用。

在Visual c++中,您可以使用Microsoft特定的行为,并使用__declspec(dllexport) inlineextern inline导出/导入内联函数。请注意,这是微软特有的行为,如果你的目标不是Windows,并且完全不关心可移植性,你可以考虑一下。