Декларация extern и определение функции как в том же файле

Я просто просматривал исходные файлы gcc. В gcc.c я нашел что-то вроде

extern int main (int, char **);

int
main (int argc, char **argv)
{

Теперь мое сомнение extern заключается в том, чтобы сообщить компилятору, что конкретная функция не находится в этом файле, но будет найдена где-то еще в проекте. Но здесь определение main происходит сразу после объявления extern. Какая цель заключается в объявлении extern?

Похоже, в этом конкретном примере extern, похоже, ведет себя как export, который мы используем в сборке, при этом мы экспортируем конкретный символ вне модуля

Любые идеи?

Ответ 1

Вы недопонимаете extern - он не говорит компилятору, что определение находится в другом файле, оно просто объявляет, что оно существует без его определения. Это совершенно нормально, если он будет определен в том же файле.

C имеет концепцию объявления (объявляя, что что-то существует без его определения) и определения (фактически приводящего его в существование). Вы можете объявлять что-то так часто, как хотите, но можете только определить его один раз.

Поскольку функции имеют внешнюю связь по умолчанию, ключевое слово extern в данном случае не имеет значения.

Ответ 2

Функции неявно являются extern в C. Включение extern является просто визуальным напоминанием. Обратите внимание, что для создания функции, отличной от внешнего, вы можете использовать ключевое слово static.

Ответ 3

В объявлении функции extern просто объявляет, что функция имеет внешнюю связь, которая по умолчанию; ключевое слово extern совершенно бесполезно в этом контексте, и эффект идентичен нормальному объявлению/прототипу без ключевого слова extern.

Ответ 4

Предупреждения, вероятно, предположили, что прототип функции отсутствует. Это все.

Ответ 5

Определение функции main:

int main(int argc, char **argv) { ... }

уже является объявлением, это прототипированный синтаксис функции main с внешней связью. Это означает, что прототипированное объявление с extern перед определением main является избыточным.