Должны ли выполняться функции extern в файлах заголовков?
Должны ли выполняться функции extern
в файлах заголовков? Или они extern
по умолчанию?
Например, должен ли я написать это:
// birthdays.h
struct person find_birthday(const char* name);
или это:
// birthdays.h
extern struct person find_birthday(const char* name);
Ответы
Ответ 1
Из C-книга:
Если декларация содержит extern спецификатор класса хранения, или объявление функции без спецификатор класса хранения (или оба), то:
- Если уже есть видимое объявление этого идентификатора с объем файла, результирующая привязка так же, как и видимого декларация;
- В противном случае результатом будет внешняя связь.
Итак, если это единственный раз, когда он был объявлен в блоке перевода, он будет иметь внешнюю связь.
Ответ 2
Они неявно объявляются с помощью "extern".
Ответ 3
Функции, объявленные в заголовках, обычно (если вы не работаете очень сильно) extern
. Лично я предпочитаю видеть там явное ключевое слово, но компилятор ему не нужен. Он напоминает читателям, что они extern
, и поскольку люди более ошибочны, чем компьютеры, я нахожу, что напоминание помогает.
С переменными важно использовать ключевое слово extern
(и без инициализатора) в файле заголовка. Следовательно, для симметрии с (очень немногими) глобальными переменными, объявленными в заголовках, я также использую extern
с этой функцией, даже если это строго не нужно.
Ответ 4
Нет, функции, объявленные в файлах заголовков, не должны быть объявлены extern
.
Но переменные, определенные в заголовке .h
, а затем #included
в нескольких .c
файлах должны быть объявлены extern.
Ответ 5
Я никогда не беспокоюсь о "extern" в моем исходном коде, но некоторые люди это делают. На мой взгляд, наличие extern перед переменными, но не функций делает его более визуально очевидным, какие вещи являются функциями и какие вещи являются переменными (возможно, включая указатели на функции). Я думаю, что многое, вероятно, зависит от того, как создаются объявления в файле .h и как они относятся к основному .c файлу. Обычно я начинаю с ввода прототипов файлов .h, а затем копирует/вставляет в .c файл и добавляет тело функции (ударяя точку с запятой в конце прототипа), поэтому требуется "extern" для добавления файл заголовка или ударить из основного .c файла после копирования/вставки.