Я бы использовал static inline
, но static
также сработал бы.
extern
и extern inline
отсутствуют, потому что вы получите несколько внешних определений, если заголовок включен вбольше чем одна единица перевода, поэтому вам нужно учитывать спецификации static
, static inline
и inline
.
В своем ответе Хептик правильно заявляет, что большинство компиляторов рассматривают функции для встраивания независимо от того, является ли inline
указано или нет, т. е. основное влияние inline
заключается в его влиянии на сцепление.
Однако определения static
имеют внутреннюю связь, поэтому между static
и static inline
нет большой разницы;Я предпочитаю static inline
для определений функций в заголовочных файлах по чисто стилистическим причинам (практическое правило: заголовочные файлы должны содержать только extern
объявлений, static const
определений переменных и static inline
определений функций).
inline
без static
или extern
приводит к встроенному определению , которое стандартное состояние (C99 6.7.4, §6)
предоставляет альтернативу внешнемуопределение, которое переводчик может использовать для реализации любого вызова функции в том же модуле перевода.Не определено, использует ли вызов функции встроенное определение или внешнее определение.
, т. Е. Встроенные определения всегда должны сопровождаться внешними определениями, а это не то, что вам нужно.
Дополнительную информацию о тонкостях встроенной семантики C99 можно найти в этом ответе , на домашней странице Clang и Обоснование C99 (PDF) .
Имейте в виду, что GCC будет использовать семантику C99, только если присутствует -std=c99
или -std=gnu99
...