这个问题是在我实现我的静态库时出现的。
我想检查我的猜测并获取有关在静态库中使用内联函数的信息。
我的猜测是静态库的实现者不能在他的库中导出内联函数
由于内联语句是 由编译器实现(由编译器决定是否制作 函数内联)通过放置代表 函数体中的操作到代码段,以便 操作不会放在导出/导入表中, 因此不能被链接器处理,因此不能被 图书馆员将静态库包含到应用程序代码中 被附上。我的逻辑对吗?我想导入函数作为内联是允许的,但我想知道它是如何实现的,因为它是编译器的 责任,但在链接状态下只有图书管理员,所以 这意味着它必须采取一些行动才能使 函数内联。
最佳答案
是的,内联函数通常放在 header 中,因此函数体在使用该函数的任何地方对编译器都是直接可见的。这让编译器可以评估是否为任何特定实例中的函数生成内联代码。
这基本上不会出现——“内联函数应在每个使用它的翻译单元中定义。” (§3.2/3)。这意味着如果编译器要生成内联函数,进入库的是目标代码,包括该函数代码的内联扩展。由于函数可能不会在每次使用时都内联扩展,因此库中通常也会有函数的定义,但该定义将(至少主要)像普通函数一样使用,而不是内联扩展。
链接器也可以生成代码。无论函数是不是语言标准的 inline
函数,并且是在与其使用的翻译单元相同或不同的翻译单元中定义的,链接器都可以生成不管怎样,它的内联代码。
长话短说,inline
关键字对典型编译器的影响很小或没有影响,就函数代码是否内联生成而言。主要(如果不是唯一)影响是它改变了单一定义规则——内联意味着同一函数的多个(相同)定义可以存在而不会导致问题。
关于c++ - 静态库。导入和导出内联函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15159561/