The definition of an `inline` function doesn't have to be in a header file but, because of the _one definition rule_ for inline functions, an identical definition for the function must exist in every translation unit that uses it. The easiest way to achieve this is by putting the definition in a header file. If you want to put the definition of a function in a single source file then you shouldn't declare it `inline`. A function not declared `inline` does not mean that the compiler cannot inline the function. Whether you should declare a function `inline` or not is usually a choice that you should make based on which version of the _one definition rules_ it makes most sense for you to follow; adding `inline` and then being restricted by the subsequent constraints makes little sense.