Подтвердить что ты не робот

Должны ли выполняться функции extern в файлах заголовков?

Должны ли выполняться функции extern в файлах заголовков? Или они extern по умолчанию?

Например, должен ли я написать это:

// birthdays.h
struct person find_birthday(const char* name);

или это:

// birthdays.h
extern struct person find_birthday(const char* name);
4b9b3361

Ответ 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 файла после копирования/вставки.