据我所知,在lib文件中将函数声明为“inline”是不可能的,并且将该函数“神奇地内联”到调用函数中的另一个项目中(因为链接与编译和后者不同)发生在之前)。
当具有相同声明但定义不同的多个函数(进入多个库)时,如何内联函数?
e.g。
obj1.lib
void function1() { printf("Hi"); }
obj2.lib
void function1() {printf("whatsup?"); }
的main.cpp
void function1();
int main()
{
function1(); // I'd like to be able to inline this, I can steer the linking against obj1 or obj2, but I can't inline this one
}
答案 0 :(得分:2)
要从对象(或库)文件内联函数,您需要使用link-time optimization (LTO)编译此对象文件。有关详细信息,请参阅Inlining functions from object files。
答案 1 :(得分:1)
即使您使用内联函数,它们也必须具有相同的定义:对C ++程序中的同一实体具有不同的定义是违反3.2中指定的一个定义规则(ODR) [basic.def.odr]。编译器和链接器通常不会检测到ODR违规,并且往往会导致相当奇怪的问题。
您需要确保功能不同,例如,使用以下技术之一:
static
仅在给定的翻译单元中显示它们。答案 2 :(得分:1)
最简单的方法是给函数命名不同的名称。
如果您想要具有给定名称的函数的内置时间选择,具有2个或更多不同的实现,并且您希望支持该函数的机器代码内联,则将其声明为inline
,这需要还提供每个变体头中的实现,并使用include和lib路径来选择相关的头(用于编译)和lib(用于链接) - 它们更好地匹配。与任何inline
函数一样,这不保证机器代码内联。关于机器代码内联inline
只是一个提示(它的保证效果是关于允许每个翻译单元中的定义,并且在每个翻译单元中使用它时都需要这样的定义。)
如何使用include和lib路径取决于您的工具链。
答案 3 :(得分:0)
编辑回应Sam Cristall的评论。
如果您的意思是“在编译时内联”,那么:
要使用库,您需要包含与该库关联的头文件。如果在该头中内联声明了所需的函数,并且函数定义(函数体)可用,则编译器将(由它自行决定)内联函数。否则就不会。
如果您的意思是“在链接时内联”(“内联”一词的不幸重载),请参阅其他答案