2013-12-12 3 views
-1

, если вы читаете стандартный файл заголовка, вероятно, вы заметите некоторое объявление внешней функции. но я не смог найти полный элемент функции в заголовках этого файла заголовка. может ли кто-нибудь сказать мне, где полное определение указанной функции. это пример: файл pthread.h заголовкагде определение внешних функций в файле заголовка

extern int pthread_create (pthread_t *__restrict __newthread, 
       __const pthread_attr_t *__restrict __attr, 
       void *(*__start_routine) (void *), 
       void *__restrict __arg) __THROWNL __nonnull ((1, 3)); 

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

+1

определение будет в библиотеке pthreads – suspectus

ответ

4

Возможно, он недоступен для вас. Люди не обязаны предоставлять исходный код заголовкам C. Например, в Windows очень часто приходится создавать определения функций в DLL и не предоставлять вам исходный код. Например, Microsoft считает исходный код для большинства внутренних служб Windows конфиденциальными.

В Linux исходный код обычно доступен, но нет простого способа сопоставить данный заголовок его исходному коду.

В вашем дистрибутиве Linux могут быть инструменты, которые помогут. Команда apt-get source на Ubuntu и Debian и команда yumdownloader --source для распределений на основе RPM могут найти источник, связанный с большинством системных пакетов.

+0

Правильно, но поскольку объекты библиотеки являются двоичными руководителями, я хочу знать, как вызов функции программы будет подключаться к телу функции, я имею в виду, как ссылка на программу-прототип связывает прототип функции с объектом-объектом , Он ищет какой-то специальный шаблон в соответствии с именем функции или что? Спасибо. – muradin

+1

@ мурадин: конечно. Любая внешняя функция, которую вы использовали в программе на C, может быть распознана только по ее имени - это все, что вы даете компоновщику! (И вы уже знаете, что вы не можете использовать одно и то же имя дважды.) Пример формата * * * библиотеки см. В f.e. http://www.microsoft.com/msj/0498/hood0498.aspx – usr2564301

0

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

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

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