I’m trying to replace some macro subroutines with inline functions, so the compiler can optimize them, so the debugger can step into them, etc. If I define them as normal functions it works:
void do_something(void)
{
blah;
}
void main(void)
{
do_something();
}
but if I define them as inline:
inline void do_something(void)
{
blah;
}
void main(void)
{
do_something();
}
it says “Error: Undefined external”. What does that mean? Taking a stab in the dark, I tried
static inline void do_something(void)
{
blah;
}
void main(void)
{
do_something();
}
and no more errors. The function definition and call to the function are in the same .c file.
Can someone explain why one works and the other doesn’t?
(Second related question: Where do I put inline functions if I want to use them in more than one .c file?)
First, the compiler does not always inline functions marked as
inline; eg if you turn all optimizations off it will probably not inline them.When you define an inline function
and use that function, even in the same file, the call to that function is resolved by the linker not the compiler, because it is implicitely “extern”. But this definition alone does not provide an external definition of the function.
If you include a declaration without
inlinein a C file which can see the
inlinedefinition, the compiler will provide an external definition of the function, and the error should go away.The reason
static inlineworks is that it makes the function visible only within that compilatioin unit, and so allows the compiler to resolve the call to the function (and optimize it) and emit the code for the function within that compilation unit. The linker then doesn’t have to resolve it, so there is no need for an external definition.The best place to put inline function is in a header file, and declare them
static inline. This removes any need for an external definition, so it resolves the linker problem. However, this causes the compiler to emit the code for the function in every compilation unit that uses it, so could result in code bloat. But since the function is inline, it is probably small anyway, so this usually isn’t a problem.The other option is to define it as
extern inlinein the header, and in one C file provide andexterndeclaration without theinlinemodifier.The gcc manual explains it thus: