Вы должны всегда определять inline
функции в заголовках. Хотя вы можете иметь функции extern inline
, общим случаем является static inline
.
Эмпирическое правило для заголовочных файлов:
- объявления функций должны быть
extern
- определения функции должны быть
static inline
- объявления переменных должны быть
extern
- определения переменных должны быть
static const
. Так как С. Росс попросил об этом, рассуждаем об этом: ресурс с внешней связью должен определяться только один раз [1]. Из этого следует, что определения не должны находиться в заголовочных файлах, которые предназначены для включения в несколько мест.
Определение static
в заголовочных файлах не приведет к каким-либо проблемам, но, как правило, на него нахмурился, поскольку код должен быть скомпилирован более одного раза и будет присутствовать в разных объектных файлах, что увеличит размер исполняемого файла (при условии, что компоновщик недостаточно умен, чтобы разобраться в дублировании кода).
Общими исключениями для этого правила являются константы и inline
функции, которые должны быть видны компилятору в каждой единицы перевода, чтобы сделать возможной дальнейшую оптимизацию.
Примечание: [1] Это не относится к inline
функций с внешним связыванием, но, как это определено, какие из многочисленных определений встроенной функции будет использоваться в оценке функции целеуказателем, они в основном бесполезны
Могу ли я поставить декларацию 'static foo' в' .h' файл, определение в '.c' файле? – Alcott
@Alcott: Нет, я думаю, вы получите ошибку: «foo» объявлен «статическим», но никогда не определялся »для каждого файла, который будет включать ваш заголовок. Подумайте о статическом как «локальном». Было бы нецелесообразно рекламировать (помещать в заголовочный файл) что-то как локальное для всех, если вы не предоставите его для локальной копии (вставки) всем. – Matthieu