В архаичных C и C ++ inline
похоже на register
: предложение (не более, чем предложение) компилятору о возможной оптимизации.
В современном C ++ inline
сообщает компоновщику, что, если несколько определений (не объявлений) находятся в разных единицах перевода, они все одинаковы, и компоновщик может свободно хранить одно и отбрасывать все остальные.
inline
является обязательным, если функция (независимо от того, насколько сложная или «линейная») определена в заголовочном файле, чтобы несколько источников могли включить ее без получения ошибки «множественного определения» компоновщиком.
Функции-члены, определенные внутри класса, по умолчанию являются «встроенными», как и шаблоны (в отличие от глобальных функций).
//fileA.h
inline void afunc()
{ std::cout << "this is afunc" << std::endl; }
//file1.cpp
#include "fileA.h"
void acall()
{ afunc(); }
//main.cpp
#include "fileA.h"
void acall();
int main()
{
afunc();
acall();
}
//output
this is afunc
this is afunc
Обратите внимание на включение файла file..h в два файла .cpp, в результате чего два экземпляра afunc()
.
Линкер откажется от одного из них.
Если не указано inline
, компоновщик будет жаловаться.