IMO both make the function to have a scope of the translation unit only.
What's the difference between "static" and "static inline" function?
Why should inline
be put in a header file, not in .c
file?
cinline()
IMO both make the function to have a scope of the translation unit only.
What's the difference between "static" and "static inline" function?
Why should inline
be put in a header file, not in .c
file?
Best Answer
By default, an inline definition is only valid in the current translation unit.
If the storage class is
extern
, the identifier has external linkage and the inline definition also provides the external definition.If the storage class is
static
, the identifier has internal linkage and the inline definition is invisible in other translation units.If the storage class is unspecified, the inline definition is only visible in the current translation unit, but the identifier still has external linkage and an external definition must be provided in a different translation unit. The compiler is free to use either the inline or the external definition if the function is called within the current translation unit.
As the compiler is free to inline (and to not inline) any function whose definition is visible in the current translation unit (and, thanks to link-time optimizations, even in different translation units, though the C standard doesn't really account for that), for most practical purposes, there's no difference between
static
andstatic inline
function definitions.The
inline
specifier (like theregister
storage class) is only a compiler hint, and the compiler is free to completely ignore it. Standards-compliant non-optimizing compilers only have to honor their side-effects, and optimizing compilers will do these optimizations with or without explicit hints.inline
andregister
are not useless, though, as they instruct the compiler to throw errors when the programmer writes code that would make the optimizations impossible: An externalinline
definition can't reference identifiers with internal linkage (as these would be unavailable in a different translation unit) or define modifiable local variables with static storage duration (as these wouldn't share state accross translation units), and you can't take addresses ofregister
-qualified variables.Personally, I use the convention to mark
static
function definitions within headers alsoinline
, as the main reason for putting function definitions in header files is to make them inlinable.In general, I only use
static inline
function andstatic const
object definitions in addition toextern
declarations within headers.I've never written an
inline
function with a storage class different fromstatic
.