Какая разница между статическими inline, extern inline и обычной встроенной функцией?

Какая разница между static inline, extern inline и нормальной inline функцией?

Я видел некоторые неопределенные объяснения по этому поводу. Насколько я понял, static inline - это не просто inline функция, которая предназначена только для указания в определенном файле, как обычно означает static ключевое слово. То же самое касается extern inline и я думаю, это не то же объяснение, что и с extern переменными. Любые ответы были бы очень благодарны!

Ответ 1

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

Определение функции с помощью только inline определяет встроенную функцию с внешней связью. Однако такое определение называется встроенным определением, и оно не работает как внешнее определение для этой функции. Это означает, что, хотя эта функция имеет внешнюю связь, она будет считаться неопределенной из других единиц перевода, если вы не предоставите для нее отдельное внешнее определение.

Определение функции с extern inline определяет встроенную функцию с внешней связью, и в то же время это определение служит внешним определением для этой функции. Эту функцию можно вызвать из других единиц перевода.

Последние два абзаца означают, что у вас есть выбор для предоставления одного extern inline определения встроенной функции с внешней связью или предоставления двух отдельных определений для нее: один inline и другой extern. В последнем случае при вызове функции компилятору разрешено выбирать одно из двух определений.