Macros are a very simple textual substitution device.
The textual substitution occurs before compile time,
whereas inline functions are inlined (if at all) at
compile time.

Inline functions have to behave just like regular functions
so their code should not be considered as executing in the
same block as the surrounding code. For instance, they cannot
access variables in the surrounding code, whereas a macro
could.

Inline functions are generally preferred over macros because
of argument type checking and separation from surrounding code.