Имя спецификатора inline
несколько вводит в заблуждение, так как предполагает, что функция должна быть встроенной.Тем не менее, inline
в первую очередь определяет связь функции (это также подсказка компилятору рассмотреть возможность встраивания).Для объявленной функции inline
в скомпилированном объекте не генерируется связываемый символ.
Поэтому функции inline
имеют смысл только тогда, когда определен (не просто объявлен) в заголовочном файле,который включен, возможно, многими модулями компиляции.Спецификатор inline
не позволяет нескольким (фактически любым ) символам этой функции быть скомпилированным компилятором в соответствующих объектных файлах.
Если небольшая функция требуется только один раз дляодин модуль компиляции, вам не нужно объявлять его где-либо еще.Более того, вам не нужно объявлять его встроенным, но поместите его в анонимное пространство имен, чтобы оно не было видно (в сгенерированном объектном файле).
Так что, либо (это, скорее всего, ваш вариант использования)
// foo.hpp:
inline void foo(bar x) { /* ... */ } // full definition
// application.cpp:
#include "header.hpp"
/* ... */ foo();
или
// application.cpp:
namespace {
inline void foo(bar x) // inline specifier redundant
{ /* ... */ }
}
/* ... */ foo();