Вы должны когда-либо определять inline
функции только в заголовках. Хотя у вас может быть extern inline
функций, общий случай static inline
.
Практическое правило для заголовочных файлов:
- объявления функций должны быть
extern
- определения функции должны быть
static inline
- объявления переменных должны быть
extern
- определения переменных должны быть
static const
Как и просил К. Росс, здесь есть причины: ресурс с внешней связью должен быть определен только один раз [1]. Из этого следует, что определения не должны находиться в заголовочных файлах, которые предназначены для включения в более чем одно место.
Наличие static
определений в заголовочных файлах не приведет к каким-либо проблемам, но обычно вызывает неодобрение, поскольку код должен быть скомпилирован более одного раза и будет присутствовать в разных объектных файлах, что увеличит размер исполняемого файла при условии, что компоновщик недостаточно умен, чтобы выяснить дублирование кода).
Распространенными исключениями из этого правила являются константы и inline
функции, которые должны быть видны компилятору в каждом модуле перевода, чтобы сделать возможной дальнейшую оптимизацию.
Примечание: [1] Это не относится к inline
функциям с внешним связыванием, но так как не указано, какое из множества определений встроенной функции будет использоваться при оценке указателя функции они в основном бесполезны