заголовочный файл и стандартная библиотека - PullRequest
4 голосов
/ 02 июня 2011

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

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

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

Ответы [ 3 ]

9 голосов
/ 02 июня 2011

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

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

Я понимаю, что библиотека - это один файл

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

Обязательно ли эти объектные коды написаны только на языке C

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

OnПри связывании весь файл библиотеки прикрепляется к исполняемому файлу

Иногда.Это то, что известно как статическое связывание .Другой основной тип - динамическое связывание , где код объекта библиотеки связан в время выполнения .

3 голосов
/ 02 июня 2011

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

Да, в большинстве случаев.Код может появиться в заголовках, которые компилятор попытается «встроить» (посмотрите).

Обязательно ли эти объектные коды написаны только на языке C, или другие языки также могут использоваться для генерации такого объектакоды?

Они могут быть написаны на любом языке соответствия, но наиболее распространенными являются C и C ++.

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

Связывание просто говорит исполняемому файлу, как вызывать базовый код библиотеки, оно не «присоединяет» библиотеку, если вы не делаете «статическое связывание.

2 голосов
/ 02 июня 2011

Файл заголовка обычно содержит только объявления и прототипы, но в современном C он может содержать «статические встроенные» функции вместе с их определениями. (А в C ++ классные шаблоны обычно имеют свои реализации в заголовочном файле, но пока не беспокойтесь об этом ...)

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

Ответ на ваш последний вопрос зависит от компоновщика. Я полагаю, что GNU ld включает в себя все функции из всех файлов .o, на которые ссылаются все функции, но, если честно, я даже не уверен. В любом случае большинство библиотек, с которыми вы ссылаетесь, являются «общими библиотеками», что означает, что ответ на ваш вопрос даже не имеет значения. (На самом деле, в общем, это не имеет большого значения, поскольку ОС будет загружать страницы с диска только тогда, когда к ним действительно осуществляется доступ. Таким образом, размер исполняемого файла на диске и объем оперативной памяти, который он занимает во время работы, может сильно отличаться. )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...