为什么编译器不会自动内联自由定义的函数?而是导致链接器错误

iam*_*ind 1 c++ inline function linker-errors language-lawyer

例:

// header.h
void foo ()  // function definition in the file
{
}

// file1.cpp
#include"header.h"
...

// file2.cpp
#include"header.h"
...
Run Code Online (Sandbox Code Playgroud)

上面的代码将导致链接器错误.假设编译器是否inline foo()自动生成,则不会出现任何链接器错误.

我的问题是语言观点.为什么编译器不会inline自动生成它?会有什么不同吗?

问题换句话说:"如果编译器假定inline在每个定义的自由函数前面会出现什么问题?"

Mar*_*k B 6

标题只被视为标题文本的复制粘贴.编译器不知道你的代码是在头文件而不是源文件中,所以它必须同时处理它们,从而允许错误.语言指定了这一点.

  • @iammilind然后,一旦你意外地拥有两个(不同的)同名函数,你就会得到不一致/无声的错误行为(而不是错误).只是不要将定义放入标题(无论如何都是组织的良好做法)并添加包含警戒(每个标题三行). (5认同)