我在实施静态库时出现了这个问题 我想在静态库中使用内联函数检查我的猜测并获取信息。
我的猜测是静态库的iplementator无法在其库中导出内联函数
由于内联声明是
由编译器实现(由编译器决定是否生成
函数内联)通过放置低级命令来表示
函数体中的操作到代码段使得
操作不会放在导出/导入表中
因此不能由链接器处理,因此不能
由librarian包含到静态lib的应用程序代码中
被附上。我的逻辑是对的吗?
我想允许导入函数作为内联,但我想知道它是如何实现的,因为它是编译器的 责任,但在联系状态,只有图书管理员,所以 这意味着它必须采取一些行动才能做出 函数内联。
答案 0 :(得分:5)
是的,内联函数通常放在标题中,因此在使用函数的任何地方编译器都可以直接看到函数体。这使编译器可以评估是否在任何特定实例中为函数生成内联代码。
这基本上不会出现 - “内联函数应在每个使用它的翻译单元中定义。” (§3.2/ 3)。这意味着如果编译器要生成内联函数,那么进入库的是目标代码,其中包括该函数代码的内联扩展。由于函数可能不会在每次使用时内联扩展,因此库中的函数通常也会有定义,但该定义将被用于(至少主要)像普通函数,而不是内联扩展。
Linkers也可以生成代码。无论函数是否是语言标准的inline
函数,并且在与其使用的函数相同或不同的转换单元中定义,链接器都可以生成内联代码无论如何。
简而言之,inline
关键字对典型编译器的影响很小或没有影响,只要函数的代码是否内联生成。主要(如果不是唯一的)效果是它改变了一个定义规则 - 内联意味着同一个函数的多个(相同)定义可以存在而不会引起问题。
答案 1 :(得分:1)
您是否理解关键字inline
- 您可以同样使用替换。
内联函数启用编译,如果是这样选择用实际代码替换函数调用 - 无需导出/导入。它在头文件中定义。任何使用目标代码的东西都需要头代码,因此编译器会用实际代码替换函数调用。
答案 2 :(得分:1)
在Visual C ++上,您可以使用Microsoft特定的行为,并使用__declspec(dllexport) inline
或extern inline
导出/导入内联函数。请注意,这是Microsoft特定的行为,如果您的目标是除Windows以外的任何内容并且完全不关心可移植性,您可以考虑它。