Содержимое и форма стандартной библиотеки С задается Стандартом ANSI/ISO. Т.е. Стандарт С определяет тот набор функций, который должен поддерживать любой стандартный компилятор. Однако при этом большинство компиляторов предоставляют дополнительные функции, которые не специфицированы в Стандарте.
Например, многие компиляторы имеют функции работы с графикой, подпрограммы, управляемые с помощью мышки, и другие им подобные, которых нет в Стандарте С. Пока программа не переносится в другую вычислительную среду, эти нестандартные функции можно использовать без каких-либо негативных последствий. Но если программа доллжна быть переносимой, применение таких программ нужно ограничить. На самом деле практически все нетривиальные программы С используют нестандартные функции, так что не нужно пугаться и избегать их только из-за того, что они не входят в стандартную библиотеку функций.
Библиотечные файлы и объектные файлы
Хотя библиотеки похожи на объектные файлы, между библиотеками и объектными файлами есть одно важное различие. При компоновке объектных файлов все содержимое каждого объектного файла становится частью конечной исполняемой программы. При этом не важно, используется на самом деле этот код или нет. В случае с файлами библиотек ситуация иная.
Шаг 5. Функции стандартной библиотеки
Библиотека представляет собой набор функций. В отличие от объектных файлов, в библиотеке каждая функция хранится отдельно. Когда программа использует библиотечную функцию, редактор связей находит эту функцию и добавляет ее код в программу. Таким образом, исполняемый файл содержит только те функции, которые используются программой, а не все библиотечные функции. Поэтому лучше хранить стандартные функции С не в объектных файлах, а в библиотеках, из которых они добавляются в программу избирательно.
Источник: t-r-o-n.ru
Стандартные функции C
Стандартные библиотеки среды выполнения C содержат версии строковых функций в Кодировке Юникод UTF-16 (расширенные символы), которые можно использовать с Юникодом , и байт-ориентированные версии строковых функций, которые можно использовать с символами из однобайтовых наборов символов (SBCS). Тип данных ЮникодА WCHAR совместим с типом данных wchar_t в ANSI C и предоставляет доступ к строковым функциям Юникода.
Версии функций в Юникоде начинаются с букв wcs (или иногда _wcs). Тип данных CHAR, используемый для кодовых страниц, совместим с символьным типом данных char в ANSI C, чтобы разрешить доступ к функциям строки символов. Символьные версии функций начинаются с букв «str». Существуют также специальные версии для двухбайтовых наборов символов (DBCS), которые начинаются с букв «_mbs».
Стандартные библиотеки среды выполнения C включают универсальные функции для всех стандартных строковых функций C. Они начинаются с «_tcs» и перечислены в файле заголовка Tchar.h. Эти функции используют универсальный тип данных TCHAR.
Встроенные стандартные библиотеки программ | Записки программиста
Приложение должно добавить следующие строки для использования универсальных функций и компиляции для Юникода.
#define _UNICODE #include #include
Обратите внимание, что требуются файлы Tchar.h и Wchar.h, а также символ подчеркивания в начале _UNICODE переменной. Эта номенклатура связана со стандартной библиотекой C. «ЮНИКОД», отображаемый без подчеркивания, предназначен для сред выполнения Microsoft Windows.
Функции wcstombs и mbstowcs могут преобразовывать набор символов, поддерживаемый стандартной библиотекой C, в Юникод и обратно с некоторыми ограничениями. Дополнительные сведения о переводе строк в Юникод и из нее см. в разделе Преобразование между строковыми типами.
Функция printf , определенная в Tchar.h, поддерживает те же спецификации формата, что и функции печати Strsafe.h, например StringCbPrintf. Аналогичным образом Tchar.h определяет функцию wprintf , в которой сама строка формата является строкой Юникода.
Плохая обработка буфера связана со многими проблемами безопасности, которые связаны с переполнением буфера. См . Справочник по Strsafe.h. Функции, определенные в Strsafe.h, обеспечивают дополнительную обработку для правильной обработки буфера в коде. Они предназначены для замены встроенных аналогов C/C++, а также конкретных реализаций Microsoft Windows. Дополнительные сведения см. в разделе Вопросы безопасности: международные функции.
Источник: learn.microsoft.com
Библиотеки стандартных и нестандартных функций
Аннотация: В данной лекции рассматриваются библиотеки стандартных и нестандартных функций. Приводятся основные определения и понятия, а также примеры практического использования библиотек.
На разных этапах развития программирования выдвигались различные концепции, которые могли бы обеспечить быстрое создание качественных программ, возможность компоновки больших программных систем из небольших хорошо отработанных модулей, возможность повторного использования ранее разработанных программ. Среди таких подходов можно упомянуть структурное и модульное программирование , объектно-ориентированное программирование . Следует отметить, что универсальных средств, которые бы полностью решали указанные задачи не существует и на сегодняшний день.
Однако определенные технологии получили свое развитие и в программировании, приблизив его к промышленным методам создания программных продуктов.
В этой связи мы должны вспомнить историю развития одного из мощнейших средств автоматизации программирования – разработку библиотек стандартных программ. В нашей стране в начале 60-х годов прошлого столетия на отечественных ЭВМ типа М-20 в Институте Прикладной математики АН СССР им. акад. М.В.
Келдыша была разработана интерпретирующая система ИС-2, которая положила начало созданию библиотек стандартных подпрограмм, а впоследствии и стандартных алгоритмов на алгоритмических языках. Традиция эта была подхвачена журналом Ассоциации вычислительных машин ( Communications of the ACM , США), который на протяжении десятков лет публиковал алгоритмы решения математических задач на языках АЛГОЛ -60 и ФОРТРАН.
Публикация исходных текстов преследовала не только просветительские цели, читатели находили ошибки в опубликованных алгоритмах, предлагали более эффективные решения. Таким способом на протяжении полутора десятков лет отлаживался и накапливался архив типовых методов решения задач линейной алгебры, дифференциального и интегрального исчислений, решения нелинейных уравнений, статистической обработки данных, вычисления математических функций и т.п. Он составил основу пакета научных программ SSP ( Scientific Subroutine Package ) на ФОРТРАНЕ, который был взят на вооружение фирмой IBM и стал доступным для пользователей IBM /360, IBM /370. С появлением в нашей стране IBM — совместимых моделей серии ЕС ЭВМ с этим пакетом познакомились и отечественные программисты.
Современные системы программирования на базе ПК, к сожалению, не оценили вычислительные возможности пакета SSP и его расширений. Конечно, они включили в состав своих системных библиотек наиболее распространенные математические функции. Но основу сегодняшних системных библиотек составляют не методы решения математических задач. Начинка системных библиотек в BC и BCB состоит, в основном, из всякого рода сервисных программ, обеспечивающих поддержку некоторых типов данных (строки, множества , комплексная арифметика, дата и время, преобразования типов данных ), управление дисплеем в текстовом и графическом режимах, обслуживание интерфейса с другими внешними устройствами и др. Те алгоритмы и программы, которые когда-то входили в состав SSP , теперь распространяются в различных коммерческих продуктах типа MathCAD , MatLab, Statistica, Mathematica и т.п.
11.1. Библиотеки системных функций в Borland C++ 3.1
Библиотеки системы BC 3.1 представлены файлами в каталоге BCLIB. Там находится примерно 25 файлов с расширениями .lib , около двух десятков файлов с расширениями .obj и три файла с расширениями .c . Для более детального знакомства с этими файлами напомним терминологию, принятую во многих системах программирования:
- исходный модуль – текстовый файл, содержащий программу на языке программирования. Для систем BC и BCB характерны расширения .c (от названия языка C) и .cpp (от названия языка C-plus-plus);
- объектный модуль – результат обработки исходного модуля компилятором с алгоритмического языка. Для многих систем программирования файлы объектных модулей имеют расширение .obj (от object – объект). Объектный модуль – это заготовка машинной программы, которая нуждается в настройке, т.к. в работе этого модуля могут потребоваться другие модули и внешние данные;
- исполняемый модуль – результат сборки и настройки совместно работающих объектных модулей. Это – готовая к работе машинная программа, обычно имеет расширение .exe (от execute – исполнять);
- библиотечный модуль – совокупность объектных модулей, которая обычно хранится в файле с расширением .lib (от library – библиотека) или .dll (от dynamic-link library – динамически загружаемая библиотека).
Большое количество файлов, находящихся в разделе BCLIB, объясняется тем, что некоторые библиотеки сформированы в нескольких вариантах для разных моделей памяти. В рамках MS-DOS система BC 3.1 могла создавать программы для шести разных моделей памяти – Tiny (крошечная), Small (малая), Medium (средняя), Compact (компактная), Large (большая) и Huge (огромная). Для каждой из этих моделей использовалось свое распределение памяти в пределах выделенного ресурса, использовалась своя адресация , разные типы указателей (ближние и дальние) и т.п. Поэтому ряд библиотек представлен в шести экземплярах.
Библиотека системных функций BC 3.1 условно разбита на 17 разделов, названия которых представлены в табл. 11.1. В общей сложности в этих разделах хранится порядка 600 функций.
Classification routines | 12 | Проверка символов на принадлежность определенной категории |
Conversion routines | 21 | Преобразование типов данных |
Directory control routines | 31 | Работа с дисками и каталогами |
Diagnostic routines | 3 | Программы диагностики |
Graphics routines | 79 | Графические процедуры |
Inline routines | 16 | Встраиваемые функции |
Input/Output routines | 110 | Управление вводом/выводом |
Interface routines | 75 | Обслуживание BIOS |
Math routines | 88 | Математические функции |
Memory routines | 28 | Управление оперативной памятью |
Miscellaneous routines | 7 | Разное (звук, задержка, переходы) |
Process control routines | 24 | Управление процессами и сигналами |
Standard routines | 30 | Стандартные функции |
String and memory routines | 43 | Управление строками и памятью |
Text window display routines | 20 | Управление дисплеем в текстовом режиме |
Time and date routines | 25 | Работа с датой и временем |
Variable argument list routines | 3 | Обслуживание списка аргументов |
Для обслуживания библиотек в состав системы программирования входит утилита tlib.exe . Запускается она из командной строки со следующим списком возможных параметров:
>tlib.exe lib_name [/C][/E][/P][/0] commands,listfile
- lib_name – имя библиотечного файла, расширение .lib можно не писать;
- [/C][/E][/P][/0] – необязательные ключи режимов работы;
- commands – команды по обслуживанию библиотеки;
- listfile – список файлов.
Ключи режимов имеют следующий смысл:
- /C – в библиотеке предусмотрено различать большие и малые буквы, как это предусмотрено и стандартом языка C (по умолчанию в библиотеках большие и малые буквы не различаются);
- /E – в библиотеке будет создан расширенный словарь, который ускорит компоновку программ, использующих объектные модули из библиотеки;
- /Pnnnn – в библиотеке будет использован заданный размер «страницы» (в MS-DOS этот размер фиксирован и равен 200h);
- /0 – из объектных модулей будут удалены записи с комментариями.
Команды, набираемые в строке, состоят из одного или двух символов, вслед за которыми указывается имя объектного модуля. В имени объектного модуля разрешается опускать расширение .obj . Символ (-ы) перед именем модуля определяет действие, которое должно быть выполнено:
- + добавить модуль к содержимому библиотеки;
- – удалить модуль из библиотеки;
- * извлечь модуль из библиотеки, сохранив там его копию;
- –+ (или +– ) заменить прежний модуль в библиотеке новым;
- –* (или *– ) извлечь модуль и удалить его из библиотеки.
С помощью утилиты tlib.exe можно выдать содержимое библиотеки в указанный файл :
>tlib.exe lib_name,1.txt
По этой команде в текстовом файле 1.txt окажется список всех объектных модулей, находящихся в библиотеке lib_name с указанием их длин и меток входа. Выглядит это примерно так:
Publics by module ABS size = 14 _abs ABSREAD size = 292 _absread _abswrite ACCESS size = 55 _access ALLOCA size = 50 _alloca
11.2. Организация пользовательских библиотек
Любую функцию, написанную на языке C или C++ можно автономно откомпилировать и получить объектный модуль , который впоследствии можно присоединять к любому проекту.
Естественно, что объектный модуль может оказаться полезным в последующей разработке программ, если он тщательно отлажен. Чтобы не хранить большое количество отдельных объектных файлов , их можно с помощью утилиты tlib.exe объединить в библиотеку. Любая библиотека может быть присоединена к проекту вновь разрабатываемой программы. Этими возможностями нужно обязательно пользоваться при разработке больших программных систем.
Для создания новой библиотеки достаточно добавить один или несколько объектных модулей к библиотечному файлу. Если такой библиотеки еще не было, то она будет создана. Пусть, например, в текущем каталоге находятся три объектных модуля с именами q1.obj, q2.obj и q3.obj . Для того чтобы создать в этом же каталоге новую библиотеку с именем qqq.lib , выполнить следующую команду:
>tlib qqq +q1 +q2 +q3
Если нам потребуется заменить модуль q1.obj на исправленную версию q1.obj , добавить модуль q4.obj и одновременно удалить из библиотеки модуль q2.obj , то это можно сделать следующим образом:
>tlib qqq -+q1 +q4 -q2
Если количество одновременно подключаемых модулей достаточно велико, то командной строки, ограниченной 127 символами, может не хватить. В этом случае обычно создают текстовый файл из строк вида:
+q1 +q2 +q3 . +q15 +q31 +q32 .
В конце каждой строки записывается символ tlink /k1 /k2 ,q1 q2 ,eq,mq,lib1 lib2
- /k1 /k2.. . – набор ключей, управляющих работой tlink ;
- q1 q2 – список объектных модулей, включая и головную функцию main ;
- eq – имя исполняемого модуля;
- mq – имя модуля, в который записывается «карта» памяти;
- lib1 lib2 – имена подключаемых библиотек.
Перечень ключей программа tlink.exe выдает после запуска без параметров. Их расшифровка приведена в табл. 11.1. Расширения имен файлов, если они стандартные, можно опускать ( .obj – объектные модули, .exe – исполняемый модуль , .map – файл «карты» памяти, .lib – библиотечный файл ). «Карта» памяти или таблица распределения памяти содержит информацию о размещении функций и глобальных переменных в сегментах памяти.
/m | Выдача «карты» памяти со всеми общедоступными именами |
/x | Запрет вывода «карты» памяти |
/i | Инициализация всех сегментов данных |
/l | Подключение номеров строк исходных программ |
/s | Вывод подробной «карты» памяти сегментов |
/n | Отключение библиотек по умолчанию |
/d | Выдача предупреждений о дублировании имен в библиотеках |
/c | Режим различения больших и малых букв |
/3 | Разрешение использовать 32-битные операнды и команды |
/v | Сохранение дополнительной информации для отладки |
/e | Игнорирование расширенных словарей в библиотеках |
/t | Создание com-файла вместо exe-файла |
11.3. Динамически загружаемые библиотеки
В довольно ранних версиях операционных систем наряду со статическими библиотеками объектных модулей появились динамически загружаемые библиотеки с расширением .dll (от Dynamic-link libraries ). Динамически загружаемые библиотеки Windows могут иметь и другие расширения – .exe или .drv .
Основная разница между статическими и динамическими библиотеками заключается в следующем. Если используется статическая библиотека, то на стадии редактирования связей в состав исполняемого модуля включаются все функции, для которых обнаружено обращение из текста исходной программы. В отличие от этого вызов модуля из динамической библиотеки происходит только на стадии выполнения программы. При таком подходе библиотечные функции не включаются в состав исполняемого модуля, его размеры становятся меньше и, тем самым, экономится место , занимаемое исполняемыми файлами на диске.
У каждого из этих подходов есть свои плюсы и минусы. При использовании статических библиотек размер исполняемого модуля возрастает, т.к. к нему подключаются все функции, упомянутые в программе. Однако такой модуль можно выполнить на любом компьютере независимо от того, установлена ли там соответствующая система программирования или нет. При использовании динамически загружаемых библиотек размер исполняемого модуля не так велик, но для его работы требуется присутствие в оперативной памяти динамической библиотеки, из которой в случае необходимости потребуется запустить тот или иной модуль . Поэтому при переносе программы на другой компьютер придется кроме исполняемого модуля захватить и всю цепочку задействованных динамических библиотек. Правда, в разумных системах программирования предусмотрен режим компиляции с включением всех вызываемых функций в состав исполняемого модуля.
Источник: intuit.ru