Декларация 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
является избыточным.