Inline function linkage

When the function in the header is not inline, then multiple definitions of this function (e.g. in multiple translation units) is a violation of ODR rules.

Inline functions by default have external linkage. Hence, as a consequence of ODR rules (given below), such multiple definitions (e.g. in multiple translation units) are Okay:

$3.2/5- “There can be more than one
definition of a class type (Clause 9),
enumeration type (7.2), inline
function with external linkage

(7.1.2), class template (Clause 14),
non-static function template (14.5.6),
static data member of a class template
(14.5.1.3), member function of a class
template (14.5.1.1), or template
specialization for which some template
parameters are not specified (14.7,
14.5.5) in a program provided that each definition appears in a different
translation unit, and provided the
definitions satisfy the following
requirements. Given such an entity
named D defined in more than one
translation unit, then

— each definition of D shall consist
of the same sequence of tokens; and […]

How the linker treats inline functions is a pretty much implementation level detail. Suffice it to know that the implementation accepts such mulitple defintions within the limitations of ODR rules

Note that if the function declaration in header is changed to ‘static inline….’, then the inline function explicitly has internal linkage and each translation unit has it’s own copy of the static inline function.

Leave a Comment