реализация заголовочных файлов C? - PullRequest
4 голосов
/ 10 мая 2011

Я изучал язык C и просматривал некоторые заголовочные файлы в каталоге Linux /usr/include, такие как stdio.h, stdlib.h и т. Д. Что меня действительно беспокоило, так это то, что я вижу, что все функции определены с extern ключевое слово, означающее, что они объявляются только без какого-либо определения, например:

extern FILE *fopen (__const char *__restrict __filename,
                    __const char *__restrict __modes) __wur;

То же самое относится ко всем остальным функциям в любом другом заголовочном файле.Мой вопрос: если они только объявлены, где их реализации?Они должны быть реализованы где-то верно?

Ответы [ 3 ]

8 голосов
/ 10 мая 2011

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

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

Если прототип существует, но реализация не может быть найдена, вы получите ошибку компоновщика (что-то вроде «неопределенного символа»).Если прототип отсутствует, код скомпилируется, но вы, вероятно, получите предупреждение об этом (спасибо Джиму Балтеру за информацию об этом).

3 голосов
/ 11 мая 2011

Заголовочные файлы определяют только интерфейс для стандартных функций библиотеки, но не для реализации;они (как правило) не содержат исполняемого кода.

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

Если вы работаете в системе Linux и используете gcc, вы можете найти эти библиотечные файлы в /usr/lib.libc.a обычно содержит основную часть стандартных библиотечных функций C (stdio, stdlib, string и т. Д.).Математические функции хранятся отдельно в libm.a.В обычных условиях gcc автоматически связывается с /usr/lib/libc.a, поэтому вам не нужно об этом беспокоиться.Если вам нужно использовать функции математической библиотеки, вам нужно добавить -lm в командную строку, чтобы связать ее с математической библиотекой.

Обратите внимание, что большинство реализаций не поставляют исходный код для самих библиотечных функций;все, что вы получаете, это предварительно скомпилированные двоичные файлы.

1 голос
/ 10 мая 2011

Файлы .h содержат объявления, определения хранятся где-то в некотором объектном файле. Более подробную информацию можно найти здесь .

...