Inline functions in C++ and C90 mode
The inline keyword is not available in C90.
The effect of __inline in C90, and __inline and inline in
C++, is identical.
When declaring an extern function to be
inline, you must define it in every translation unit that it is
used in. You must ensure that you use the same definition in each
translation unit.
The requirement of defining the function in every translation
unit applies even though it has external linkage.
If an inline function is used by more than one translation
unit, its definition is typically placed in a header file.
Placing definitions of non-inline functions in header files
is not recommended, because this can result in the creation of a
separate function in each translation unit. If the non-inline function
is an extern function, this leads to duplicate symbols
at link time. If the non-inline function is static,
this can lead to unwanted code duplication.
Member functions defined within a C++ structure, class, or
union declaration, are implicitly inline. They are treated as if
they are declared with the inline or __inline keyword.
Inline functions have extern linkage unless they
are explicitly declared static. If an inline function
is declared to be static, any out-of-line copies of the function
must be unique to their translation unit, so declaring an inline
function to be static could lead to unwanted code duplication.
The compiler generates a regular call to an out-of-line copy
of a function when it cannot inline the function, and when it decides
not to inline it.
The requirement of defining a function in every translation
unit it is used in means that the compiler is not required to emit
out-of-line copies of all extern inline functions.
When the compiler does emit out-of-line copies of an extern inline
function, it uses Common Groups, so that the linker eliminates duplicates,
keeping at most one copy in the same out-of-line function from different
object files.
See also