3

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

  • 我的猜测是静态库的实施者无法在他的库中导出内联函数
    由于内联语句是由编译器通过放置表示操作的低级命令来实现的(是否使函数内联取决于编译器)在代码段的函数体中,这样操作就不会放在导出/导入表中,因此不能被链接器处理,因此不能被库管理员包含到静态库所在的应用程序代码中被附上。我的逻辑对吗?

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

4

3 回答 3

6
  1. 是的,内联函数通常放置在标头中,因此无论在何处使用该函数,编译器都可以直接看到函数体。这让编译器可以评估是否在任何特定实例中为函数生成内联代码。

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

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

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

于 2013-03-01T14:13:51.910 回答
2

您了解关键字inline吗 - 您同样可以使用替换。

如果选择用实际代码替换函数调用,则内联函数启用编译 - 无需导出/导入。它在头文件中定义。任何使用目标代码的东西都需要该头代码,因此编译器会将函数调用替换为实际代码。

于 2013-03-01T14:08:51.307 回答
2

__declspec(dllexport) inline在 Visual C++ 上,您可以使用 Microsoft 特定的行为,并使用或导出/导入内联函数extern inline。请注意,这是 Microsoft 特定的行为,如果您的目标不是 Windows 并且根本不关心可移植性,您可以考虑它。

于 2013-04-28T12:06:27.600 回答