我正在对 VS2019 中的 C++ 内联函数进行一些(可能是奇异的)实验:
来源1:
#include "pch.h"
inline int inline_func(int i) {
return i;
}
void testinline1()
{
inline_func(0);
}
来源2:
#include "pch.h"
inline int inline_func(int i) {
return i*i ;
}
void testinline2()
{
inline_func(0);
}
主要来源:
#include "pch.h"
inline int inline_func(int i);
int main(int argc,char* argv[])
{
int i = inline_func(2);
}
根据http://en.wikipedia.org/wiki/Inline_function的“内联函数的存储类”部分,
在 C++ 中,如果需要,内联定义的函数将发出一个在翻译单元之间共享的函数,通常通过将其放入需要它的目标文件的公共部分。该函数在任何地方都必须具有相同的定义,并且始终使用 inline 限定符。
source1 和 source2 中的 inline_func 的定义不同,所以应该会有错误,但是在 VS2019 中没有这样的错误。
main() 中 i 的结果是 2,它来自 source1 中的 inline_func,这似乎是构建过程的随机选择,因为如果我在 source1 中注释 testinline1,那么我将变为 4,因为 source1 中的 inline_func 不会显示在目标文件中而不在同一源中使用。当我在 source2 中评论 testinline2 时, inline_func 也会出现未定义的符号错误,如预期的那样。
为什么会发生这些?这是 C++ 不涵盖的地方还是只有 MSVC 不涵盖的地方?
回答后更新:
这是一个更好的例子:
来源1:
#include "pch.h"
int non_inline_func();
inline int inline_func2() {
return non_inline_func();
}
static int non_inline_func()
{
return 1;
}
int public_func1()
{
return inline_func2();
}
来源2:
#include "pch.h"
int non_inline_func();
inline int inline_func2() {
return non_inline_func();
}
static int non_inline_func()
{
return 2;
}
int public_func2()
{
return inline_func2();
}
主要来源:
#include "pch.h"
int public_func1();
int public_func2();
void TestInline()
{
int i =public_func1();
int j= public_func2();
}
结果是 i=j=1。内联函数的定义在这里是一样的。这应该违反:https ://en.cppreference.com/w/cpp/language/definition#One_Definition_Rule
每个定义中的名称查找找到相同的实体(在重载解析之后)