Ответ 1
Определение функции со static inline
определяет встроенную функцию с внутренней связью. Такая функция работает "как ожидалось" из "обычных" свойств этих классификаторов: static
дает ей внутреннюю связь, а inline
делает ее встроенной. Таким образом, эта функция является "локальной" для единицы перевода и встроенной в нее.
Определение функции с помощью только inline
определяет встроенную функцию с внешней связью. Однако такое определение называется встроенным определением, и оно не работает как внешнее определение для этой функции. Это означает, что, хотя эта функция имеет внешнюю связь, она будет считаться неопределенной из других единиц перевода, если вы не предоставите для нее отдельное внешнее определение.
Определение функции с extern inline
определяет встроенную функцию с внешней связью, и в то же время это определение служит внешним определением для этой функции. Эту функцию можно вызвать из других единиц перевода.
Последние два абзаца означают, что у вас есть выбор для предоставления одного extern inline
определения встроенной функции с внешней связью или предоставления двух отдельных определений для нее: один inline
и другой extern
. В последнем случае при вызове функции компилятору разрешено выбирать одно из двух определений.