如果我们在类定义本身中定义一个成员函数,它是否必须内联处理,或者它只是对编译器的一个请求,它可以忽略.
ISO C++表示C++中成员函数的内联定义与使用内联声明它的相同.这意味着将在使用成员函数的每个编译单元中定义该函数.但是,如果函数调用因任何原因无法内联,则该函数将"照常"实例化.(http://msdn.microsoft.com/en-us/library/z8y1yy88%28VS.71%29.aspx我对这个定义的问题在于它没有告诉它将被实例化到哪个翻译单元.我遇到的问题是,当在一个静态库中面对两个目标文件时,这两个目标文件都引用了一些无法内联的内联成员函数,链接器可能会"选择"任意对象文件作为定义的源.这种特殊选择可能会引入不必要的依赖关系.(除其他事项外)
例如: 在静态库中
A.h:
class A{
public:
virtual bool foo() { return true; }
};
Run Code Online (Sandbox Code Playgroud)
U1.cpp:
A a1;
Run Code Online (Sandbox Code Playgroud)
U2.cpp:
A a2;
Run Code Online (Sandbox Code Playgroud)
和许多依赖
在另一个项目 main.cpp中:
#include "A.h"
int main(){
A a;
a.foo();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
第二个项目是第一个.我如何知道编译器将使用哪个定义,以及哪些目标文件与其依赖关系将被链接?那个标准上有什么标准吗?(试过,但未能找到)
谢谢
编辑:因为我看到有些人误解了问题所在,我想强调:如果编译器决定为该函数创建一个符号(在这种情况下,由于'虚拟',它将会是不同目标文件中的几个(外部看到的)实例化,链接器选择哪个定义(从哪个目标文件?)?)