inline-
instead of either a declaration or definition, you are giving the toolhain a definition (and declaration) that will not trigger a multiple definition error, and allows the options of either 'calling' the function (this function must be callable, and exist somewhere else if ends up being called) or producing a 'copy' inline (it has all the information it needs to do either, as opposed to a definition where the function body is unknown)
inline int somefunc(int a){ return a+1; }
so this usage is somewhat rare as it requires the function to actually exist somewhere else in case the toolchain decides to 'call' the function, which will depend on how complex the function is and the optimization settings (most usage/misuse like this will work inadvertently, only because the toolchain will most likely produce an inline copy and rarely make a 'call')
a more common use is in combination with 'static' (typically in a header, but can be useful in a source file also)
static inline int somefunc(int a){ return a+1; }
where you are using the 'inline' keyword only to eliminate the toolchain complaining about unused function(s) if the function is unused
a function that lives in a header would typically be 'static inline', where the 'static' makes it local to the translation unit and also allows for it being unused without the toolchain complaining ('tricking' the toolchain into thinking it may be used in another translation unit)- the 'static' is all the toolchain needs to fully optimize its use(s)
summary-
inline
there is an external function by this name, either call it or produce the code inline (toolchain's choice) since the definition is known
(since the option to call the external function exists, no guarantee you get the inlined version)
static inline
useful for headers, where 'static' does the work of getting the compiler to fully optimize its use(s) and the 'inline' just prevents unused function complaints
The 'static' keyword is the more useful and more appropriate keyword in most cases. The 'inline' keyword only gives the option for 'static-like', but no guarantee.
If using C++, there are other things to say- like implied inline when a class definition lives in a header, inline variables (c++17), etc.
As I said previously, use C best practices such as 'static' and 'const' and leave the 'inline' keyword alone until actually required. Outside these best practices, I would not spend a lot of time worrying about whether functions are called/inlined as there are plenty of other more important things to spend time on.