прототип внешней функции и статическое определение - PullRequest
1 голос
/ 21 января 2012

Я работаю над созданием FreeGLUT на OSX и сталкиваюсь со многими случаями той же проблемы.Многие из функций существуют только в .c файлах.

Вот пример

extern void fghRestoreState( void );

static void fghRestoreState( void ){...}

У меня ограниченное понимание C, но ошибки компилятора, кажется, имеют смысл:

src/Common/freeglut_gamemode.c:252: error: static declaration of ‘fghRestoreState’ follows non-static declaration
src/Common/freeglut_gamemode.c:43: error: previous declaration of ‘fghRestoreState’ was here

Мой вопрос: есть ли причина, по которой они так настроены?Будет ли он правильно компилироваться на других платформах?

1 Ответ

6 голосов
/ 21 января 2012

Ключевое слово extern перед функцией означает внешнюю связь .
Это позволяет использовать функции, определенные в других единицах перевода в ваш собственный исходный файл.
Другими словами, он позволяет вам использовать fghRestoreState() в другом файле, который не содержит его объявления.

Принимая во внимание, ключевое слово static подразумевает Internal Linkage, то есть функция должна быть видимой только в файле, в котором она определена и объявлена.
Проще говоря, это говорит компилятору, что я буду использовать эту функцию только в этом исходном файле,скрыть его от всех других файлов в моем проекте.

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

Поэтому выберите ключевое слово в соответствии с вашим использованием функции.

...