Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Теллес М. - Borland C++ Builder. Библиотека программиста - 1998

.pdf
Скачиваний:
764
Добавлен:
13.08.2013
Размер:
4.35 Mб
Скачать

Borland C++ Builder (+CD). Библиотека программиста 181

for (int i=0; i<Table2->FieldCount; ++i)

{

ListBox1->Items-> Add(Table2->FieldDefs->Items[i]->Name);

}

}

}

Дам вам небольшой совет: если вы, как и я, работаете с небольшим разрешени ем экрана, то вам, наверное, неудобно переключаться между большими формами типа этой и окном редактора кода. Вы можете сделать это прямо в среде разработки: нажав кнопку F12, находясь в редакторе форм, вы переключитесь в окно редактора кода.

Итак, мы разобрались с первыми двумя этапами. Третий этап начинается после того, как пользователь что-то выбрал из каждой таблицы. Для воплощения добавьте по обработчику для события OnClick каждого списка. Следующий код добавьте в оба обработчика (здесь показан только один, но они одинаковы) или в общий обработчик для обоих списков:

void __fastcall TForm1::ListBox1Click(TObject *Sender)

{

if (ListBox1->ItemIndex != -1 && ListBox2->ItemIndex != -1) DoSQLProcess();

}

Теперь все, что нам осталось сделать, — это определить метод DoSQLProcess. Этот метод создает динамический запрос SQL (Structural Query Language, структури рованный язык запросов) и связывает его с объектом TQuery, который мы используем для загрузки данных в сетку. Давайте сначала взглянем на код метода DoSQLProcess, а потом поговорим о том, как он работает:

void TForm1::DoSQLProcess(void)

{

int nList1Idx = ListBox1->ItemIndex; AnsiString s1 = ListBox1->Items->Strings[nList1Idx].c_str(); int nList2Idx = ListBox2->ItemIndex; AnsiString s2 = ListBox2->Items->Strings[nList2Idx].c_str(); AnsiString s = "SELECT * FROM \"";

s += Table1->DatabaseName.c_str(); s += Table1->TableName.c_str();

s += "\" as T1"; s += ",";

s += "\"";

s += Table2->DatabaseName.c_str(); s += Table2->TableName.c_str();

s += "\" as T2"; s += " WHERE ";

s += "T1." + s1 + " = T2. " + s2; // Присваиваем строку SQL Query1->SQL->Add(s); Query1->Active = true;

}

Borland C++ Builder (+CD). Библиотека программиста 182

Как это работает?

Свойство SQL объекта TQuery представляет собой список строк, образующих команду SQL, которую мы хотим передать базе данных. Язык SQL как таковой не относится к предмету рассмотрения данной книги, но детали этого примера представляют для нас интерес. Сначала мы создаем строку, состоящую из стандартно го оператора SQL SELECT:

SELECT * from db1, db2

где db1 это имя первой таблицы базы данных, а db2 имя второй. Беда в том, что мы не используем таких простых обозначений, как db1 или db2. Вместо этого имена таблиц имеют вид диск:\каталог\имятаблицы.dbf . Это существенно усложняет работу с именами таблиц. Язык SQL максимально нагляден, поэтому мы заключаем имена баз данных в кавычки. Первая часть

оператора выглядит как

SELECT * from "d:\directory1\table1.dbf",

"d:\directory2\table2.dbf"

что является обычным оператором SQL. Следующая часть оператора предложение WHERE, которое выглядит примерно как db1.field = db2.field. Это предложение возвращает все записи, в которых поле в db1 идентично полю в db2. Проблема в том, что SQL сломается и умрет на утверждении типа:

WHERE d:\directory1\table1.dbf.field =

d:\directory2\table2.dbf.field

Для того чтобы справиться с этой проблемой, мы используем оператор SQL, определяющий псевдонимы (alias statements, AS), который позволяет нам обращаться к таблице по более короткому имени. В нашем случае мы именуем обращение к первой таблице как t1, а ко второй как t2. После этого мы можем обращаться к полям как t1.field и t2.field.

После того как строки SQL созданы, мы добавляем их в поле Strings объекта TQuery, а затем делаем запрос активным. Это повлечет за собой выбор заданных нами записей из таблиц и их загрузку в сетку. Все очень просто, не так ли? Да, просто, но только если вы знаете, что и как сделать.

Использование источников ODBC с объектами баз данных CBuilder

Один из вопросов по базам данных, наиболее часто задаваемых в сети Internet, это вопрос о том, как использовать базы данных ODBC с CBuilder. В вопросе речь идет, как правило, о базе данных Microsoft Access, но вся описываемая ниже процедура применима и ко всем остальным базам данных ODBC.

Для начала найдите и откройте ODBC Administrator, который обычно расположен в панели управления Windows 95 или Windows NT. Для того чтобы попасть туда, откройте панель управления (Start|Settings) и дважды щелкните на иконке ODBC в основном экране панели управления.

Находясь в ODBC Administrator (администраторе ODBC), выберите кнопку Add (добавить). Вам будет предложен список типов баз данных в открывшемся окне диалога Add Data Source.

Borland C++ Builder (+CD). Библиотека программиста 183

Выберите тип базы данных, которую хотите открыть. Для файлов Microsoft Access вам следует выбрать «Access data *.mdb».

Нажмите в этом окне кнопку OK, и откроется окно диалога, озаглавленное «ODBC Microsoft Access Setup». Введите имя, которое собираетесь использовать как источник базы данных в CBuilder. Например, введите имя CBuilderAccess.

Нажмите кнопку Select Database (выбрать базу данных) и перейдите к файлу базы данных, который собираетесь использовать с CBuilder. Нажмите кнопку OK, и имя базы данных появится в окне диалога Setup. Нажмите кнопку OK в окне Setup, а затем кнопку Close в окне диалога Add Data Source. Этим вы закроете ODBC Administrator.

Теперь откройте Borland Database Configuration Utility, которая поставляется с CBuilder. Вы найдете эту программу в подменю Borland меню Start в Windows 95. В основном окне

Configuration Utility нажмите кнопку New ODBC Driver. В поле ввода SQL Link Driver введите строку ODBC_ACCESS. Из списка ODBC Driver (существующих драйверов ODBC) выберите «Microsoft Access Driver (*.mdb)». Установите имя источника данных по умолчанию CBuilderAccess, как вы делали в окне администратора ODBC.

Щелкните на вкладке Aliases (псевдонимы) внизу экрана конфигурации. Нажмите кнопку New Alias (новый псевдоним) и назовите новый псевдоним так, как вам нравится. Выберите тип баз данных ODBC_ACCESS.

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

Database для нового объекта TTable или TQuery.

Что мы узнали в этой главе?

Это была весьма подробная глава, анализирующая внешние и внутренние аспекты программирования баз данных с использованием CBuilder и VCL. Как минимум, в этой главе вы должны были изучить следующие аспекты:

·просмотр структуры полей базы данных во время выполнения;

·создание базы данных по вашему собственному или заданному пользовате лем критерию;

·работа с компонентами, воспринимающими данные, для ускорения работы с базой данных;

·соединение с ODBC-источником в CBuilder;

·работа с объектом TQuery для соединения с несколькими таблицами одновременно;

·отфильтровка ненужных данных в базе;

·просмотр данных в базе с использованием воспринимающей данные сетки.

Глава 8. Антракт: инструменты CBuilder

Утилиты командной строки

Работа с ресурсами

Импорт DLL

Что такое grep?

Просмотр содержимого библиотек

Работа с BDE

Интегрированная среда разработки более всего на виду в системе CBuilder, но кроме нее есть еще много составляющих. Большинство из инструментов, составляющих среду разработки, могут быть использованы отдельно от нее для выполнения более простых задач, и в этой главе мы их и

Borland C++ Builder (+CD). Библиотека программиста 184

рассмотрим компилятор, компоновщик и компилятор ресурсов. Мы также поговорим об использовании некоторых утилит, поставляемых с системой, — grep, tlib, IDEToMak и tdump. Должен вас предупредить, что большинство из инструментов системы CBuilder лучше всего работают, будучи запущенными из командной строки (в окне MS-DOS), так что если вы не чувствуете себя уверенно в этом режиме, то при работе с некоторыми инструментами у вас возникнут проблемы.

Работа с компилятором из командной строки

Первым инструментом командной строки, который мы рассмотрим, станет компилятор bcc32.exe. Этот инструмент может быть использован для работы с небольшими тестовыми программами, которые вы захотите собрать воедино, служащими

Работа с компилятором из командной строки

для проверки небольших алгоритмов и написания простейших вспомогательных программ. Этот компилятор обладает большой мощью, но вряд ли вы будете собирать большие программы из командной строки. Для использования компилятора командной строки вам надо сначала создать исходный текст программы в каком-нибудь редакторе. После чего вы просто набираете в

командной строке

bcc32 mysource.cpp

где mysource.cpp — это имя исходного файла, который вы хотите скомпилировать. Компилятор автоматически оттранслирует исходный код и, если не произойдет ошибок при компиляции, соберет его в консольное приложение. Практически любой тип кода на C++ может быть скомпилирован таким образом, от небольшой прикладной программы до утилит Unix, перенесенных в Windows 95/NT.

Давайте рассмотрим некоторые параметры компилятора командной строки. Большинство параметров вы вряд ли будете использовать при написании небольших программ, но некоторые могут оказаться весьма полезными либо при написании новой программы, либо при импортировании приложения на C++ из другой среды. В табл. 8.1 представлены наиболее часто употребляемые аргументы командной строки компилятора с пояснениями.

Таблица 8.1. Наиболее часто используемые аргументы командной строки BCC32.EXE

-C Позволяет использовать вложенные комментарии в исходном файле

-I Позволяет определить каталоги, в которых будет производиться поиск заголовочных (.h) файлов

-L Позволяет определить каталоги, в которых будет производиться поиск подключаемых библиотек (.LIB)

-N Проверка переполнения стека. Если вы не используете этот аргумент, ваша программа может «повесить» то окно MS-DOS, в котором она запущена

-P Принуждает компилировать исходный код как код на C++. Этот параметр полезен, когда исходный файл не имеет расширения .cpp

-c Только компиляция. Используется при проверке синтаксиса и выяснения, почему же «виснет» среда разработки

-e Изменяет имя конечного исполняемого файла. По умолчанию имя совпадает с именем

первого скомпилированного модуля

-tW Создает приложение для Windows. Генерирует соответствующий код для начала

и завершения приложения

-v Позволяет производить отладку на уровне исходного текста

Borland C++ Builder (+CD). Библиотека программиста 185

-x Разрешает обработку исключительных ситуаций

-H Использует предварительно скомпилированные (pre-compiled) заголовочные файлы в процессе компиляции. Может существенно ускорить процесс, если в вашей программе

несколько модулей

-u Генерирует «подчеркивания» (_) для внешних имен. Очень полезен при создании DLL для использования с другими системами, например с Delphi или Visual Basic

-w Позволяет подавлять определенные предупреждения, которые вы не хотите видеть -U Удаляет определение заданного макроса. Полезен, если вы хотите заменить макрос функцией или удалить какой-то конкретный кусок кода #ifdef

Простой пример

Рассмотрим небольшой пример использования компилятора. Предположим, что у нас есть алгоритм, позволяющий вычислить факториал заданного числа. Если вы подозреваете, что в коде алгоритма есть ошибка и хотите его проверить, вы можете создать небольшую тестовую программу, запускаемую из командной строки. Предположим, что у нас был следующий код:

#include <stdio.h> #include <stdlib.h> #include <string.h> double fact(int nNum)

{

double dFact = 1.0;

for ( int i=1; i<=nNum; ++i ) dFact *= (double)i;

return dFact;

}

int main(int argc, char **argv)

{

if (argc < 2 ) return -1;

int nNum = atoi(argv[1]);

printf("Факториал %d = %lf\n", nNum, fact(nNum)); return 0;

}

Эта программа вычисляет факториал числа, введенного пользователем. Чтобы скомпилировать ее из командной строки, вам надо набрать bcc32 fact.cpp. В результате компиляции вы увидите следующее:

d:\test>bcc32 fact.cpp Borland C++ 5.2 for Win32

Copyright (C) 1993, 1997 Borland International fact.cpp;

Turbo Link Version 2.0.68.0

Copyright (C) 1993, 1997 Borland International

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

fact 5

Работа с компилятором из командной строки

в результате чего будет вычислен факториал числа 5. Вывод программы будет выглядеть

Borland C++ Builder (+CD). Библиотека программиста 186

следующим образом:

d:\test>fact 5

Факториал 5 = 120.000000

Компилятор командной строки бывает также полезен для тестирования в случае появившегося в CBuilder сообщения «Unknown Error #1» («Неизвестная ошибка №1»). Хотя в большинстве случаев эта проблема обычно решается поэтапным удалением файлов компиляции и сборки (*.il?), иногда она вызвана тем, что компилятор чего-то не понимает в вашем исходном коде. Перейдя в режим работы с командной строкой и скомпилировав модуль с различными аргументами, вы можете докопаться до ключа к разгадке.

Компилятор ресурсов

Ресурсы являются основой большинства приложений Windows, и CBuilder позволяет вам легко импортировать их в приложения CBuilder, что мы увидим ниже.

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

предварительно скомпилировать ресурсные файлы для распространения скомпилированной версии (файлы res) среди других программистов. Для этого фирма Borland предоставляет две различные программы работы с ресурсными файлами. BRC32.EXE — это 32-битный компилятор и компоновщик ресурсов. Эта программа скомпилирует ресурсный файл и свяжет его в работе с используемыми вами старыми приложениями Windows, которые требуют раздельной компиляции и сборки. Для запуска BRC32 используйте следующий синтаксис: BRC32.EXE filename, где filename — имя как вашего ресурсного файла (.rc), так и исполняемого приложения (.exe). В табл. 8.2 представлены часто используемые параметры компилято ра ресурсов.

Таблица 8.2. Часто используемые параметры компилятора ресурсов (BRC32.EXE)

-r Только компилировать файл, не связывая. То же самое, что запустить программу BRCC32.EXE -fo<filename> Делает <filename> именем выходного res-файла, по умолчанию это имя совпадает с именем входного файла с расширением .res

-fe<filename> Делает <filename> именем выходного исполняемого файла, по умолчанию это имя совпадает с именем входного файла с расширением .exe

-l Позволяет указывать путь для поиска подключаемых файлов

-x Указывает компилятору игнорировать переменную среды INCLUDE

и использовать только определенный вами путь к заголовочным файлам -Vd.d Позволяет пометить получившийся исполняемый файл как файл версии Windows d.d (по умолчанию 4.0) для запуска в Windows 95/NT

Для использования компилятора ресурсов вам необходимо иметь файл ресурсов. Если вам захочется, к примеру, добавить таблицу строк в ваш исполняемый файл, чтобы использовать определенные пользователем сообщения, вы можете создать ресурс подобным образом:

//////////////////////////////////////////////////////////// /////////

//

// Таблица строк

//

STRINGTABLE DISCARDABLE BEGIN

Borland C++ Builder (+CD). Библиотека программиста 187

101"Первая строка."

102"Вторая строка."

103"Третья строка."

END

Этот файл ресурсов позволит вам использовать в вашем приложении функцию LoadString, чтобы попасть на определенную строку в ресурсе. Для того чтобы скомпилировать этот файл, вам следует использовать синтаксис brc32 -r strings.rc.

С другой стороны, вы можете просто набрать brcc32 strings.rc. В обоих случаях будет сгенерирован новый откомпилированный файл ресурсов strings.res, который может быть включен в ваше приложение и использован для загрузки строк. Запуск указанных выше команд отобразится в окне командной строки следующим образом: d:\test>brcc32 strings.rc

Borland Resource Compiler Version 5.02

Copyright (с) 1990, 1997 Borland International.

All rights reserved.

Использование компилятора ресурсов вовсе не сложно, но в некоторых приложениях может дать очень неплохие результаты. Правда, вы скорее не будете использовать компилятор командной строки, а вместо этого просто включите файл ресурсов (.rc) в проект CBuilder, открытый в IDE, и позволите самой IDE запускать программу BRCC32.

Использование программы Implib

Программа Implib предназначена для создания библиотек импорта (import libraries) для DLL (динамически связываемых библиотек), которые вы хотите подключить к своему приложению. Важно использовать именно версию Borland CBuilder этой программы при создании библиотек импорта для использования в приложениях CBuilder. Более старые версии фирмы Borland или же аналоги других фирм создадут библиотеки, некорректно поддерживаемые CBuilder, что повлечет за собой появление в вашей программе сообщений об ошибках странного содержания. Мы рассмотрим использование DLL в CBuilder, равно как и создание DLL в CBuilder для других приложений, в следующей главе. А сейчас давайте просто рассмотрим те шаги, которые надо

предпринять для создания библиотеки импорта для использова ния в вашем основном приложении в CBuilder.

Предположим, что у вас есть DLL, которую вы хотели бы использовать в вашем приложении. Эта DLL могла быть создана в CBuilder, в Visual C++, в Delphi или в любой другой системе, способной создавать DLL. Есть две основные вещи, которые вам хотелось бы сделать для использования этой динамической библиотеки (DLL). Во-первых, сгенерировать файл библиотеки импорта (.lib) для этой DLL, который можно подключить к вашему исполняемому файлу. Это делается командой implib. Во-вторых, вам бы хотелось знать, какие функции в DLL можно вызывать. Это получается так: вы берете только что сгенерированную implib библиотеку импорта и передаете ее как параметр команде tlib, которая создаст листинг функций, доступных в библиотеке. Используя эти две программы, вы можете создать файл листинга для любого стандартного DLL-файла в системе

Windows.

Давайте используем программу implib для создания библиотеки импорта для одной из DLL в вашем каталоге Windows (или WinNT в случае Windows NT 4.0) и посмотрим, что доступно в этой библиотеке для использования в вашем приложении. Например, в вашем каталоге Windows

Borland C++ Builder (+CD). Библиотека программиста 188

находится файл Winsock.DLL. Winsock — это реализация библиотеки соединений через сокеты (sockets) под Windows, которая есть в Unix и других системах и которую можно очень здорово использовать для создания эффективных приложений для соединения через Internet.

Первым делом запустите программу implib с файлом WINSOCK.DLL, набрав следующую команду в командной строке:

C:\WINDOWS>implib winsock.lib winsock.dll

Borland ImpLib Version 2.0.140.1

Copyright (c) 1991, 1997 Borland International

После выполнения программы в каталоге C:\Windows (в нашем случае) должен появиться файл Winsock.LIB. Теперь вы можете изучить этот файл, используя программу tlib (о которой мы поговорим позже):

c:\WINDOWS>tlib winsock.lib, winsock.lst

TLIB 4.00 Copyright (c) 1987, 1997 Borland International

Как мы увидим чуть позже, эта команда создает файл листинга для библиотеки, в котором показаны все общие (public) имена (идентификаторы) из библиотеки. Общий идентификатор это экспортированная (exported) функция или объект, которые вы можете использовать в своем приложении, связав его с библиотекой импорта. Вот небольшой фрагмент этого файла, показывающий функции, которые вы можете импортировать из файла WINSOCK.DLL:

Publics by module ACCEPT size = 0 ACCEPT

BIND size = 0

Глава 8•Антракт: инструменты CBuilder BIND

CLOSESOCKET size = 0 CLOSESOCKET CONNECT size = 0 CONNECT GETHOSTBYADDR size = 0 GETHOSTBYADDR GETHOSTBYNAME size = 0 GETHOSTBYNAME GETHOSTNAME size = 0 GETHOSTNAME GETNETBYNAME size = 0 GETNETBYNAME

Вы увидите функции, которые есть в документации к Winsock. Например, функция GetHostName возвращает вам имя сервера, к которому в данный момент существует подключение. Программа implib в комбинации с tlib может вам дать огромное количество информации о доступных функциях в DLL. Довольно много недокументированных функций Windows были найдены путем запуска программы implib с системными DLL и последующего просмотра листингов программы tlib. К примеру, USER.EXE — это не более чем замаскированная DLL. Попробуйте запустить implib с файлом USER.EXE (находится в каталоге \Windows\System). После чего «скормите»

Borland C++ Builder (+CD). Библиотека программиста 189

получившийся файл USER.LIB программе tlib и посмотрите на выходной файл USER.LST. Я уверен, что если вы будете смотреть достаточно внимательно, то найдете как минимум одну функцию, которой нет в официальной документации к Win32.

Работа с IDEToMak

Если вы раньше использовали (или по-прежнему используете) компилятор Borland C++ (последняя версия 5.02), то вы, вероятно, захотите взять какие-нибудь существующие проекты и загрузить их в среду CBuilder. Зачем вам это нужно? Чтобы удобнее работать с окнами (формами), а также чтобы конвертировать библиотеки DLL в новые VCL, — вот уже две причины, которые первыми приходят на ум.

К сожалению, компилятор Borland C++ держит информацию о проекте в специальном файле с расширением IDE, и этот *.IDE файл не совместим с CBuilder. В конце концов, не станете же вы ожидать, что две разные версии разных языковых оболочек будут совместимы? Ну, в мире Windows, наверное, не станете, но вот в мире Borland — другое дело.

Программа IDEToMak конвертирует существующий IDE-файл проекта из Borland C++ в эквивалентный файл проекта (MAK) в системе CBuilder. Чтобы запустить программу IDEToMak, перейдите в каталог с IDE-файлом и введите:

IDEToMak <IDEFile>

Например, если у вас был проект в Borland C++, который назывался Test, то вы бы набрали:

IDEToMak Test.IDE

В результате получился бы файл Test.MAK в каталоге Test. У программы IDEToMak нет опций; это простая утилита, которая совершает прямое преобразование.

Использование препроцессора

Как большинство компиляторов C++, Borland CBuilder поставляется с программой препроцессора. В CBuilder она называется CPP32.EXE. Препроцессор отвечает за замену всех директив препроцессора в полный исходный код приложения перед тем, как вызывается компилятор. Препроцессор работает с такими выражениями, как #include, #define, #ifdef и т. д. Представьте, например, что у вас был следующий исходный файл:

#ifdef WORKING int x = 1;

#else

int x = 2; #endif

#define X_WORD 32 int main(void)

{

int z = X_WORD + 99;

// Здесь что-нибудь делаем с z return 0;

}

Это простое приложение использует несколько директив препроцессора (#ifdef, #else, #endif, #define). Если бы вы пропустили приложение через препроцессор, набрав

C:\test>cpp32 test.cpp

Borland C++ Builder (+CD). Библиотека программиста 190

Borland C++ Preprocessor 5.2 for Win32 Copyright (c) 1993, 1997 Borland International TEST.CPP:

то вы бы увидели, что результат записан в файл test.i. Вот как этот файл выглядит для данного исходного файла:

/* TEST.CPP 1: */

/* TEST.CPP 2: */

/* TEST.CPP 3: */

/* TEST.CPP 4: */int x = 2; /* TEST.CPP 5: */

/* TEST.CPP 6: */

/* TEST.CPP 7: */

/* TEST.CPP 8: */

/* TEST.CPP 9: */int main(void) /* TEST.CPP 10: */{

/* TEST.CPP 11: */int z = 32 + 99; /* TEST.CPP 12: */

/* TEST.CPP 13: */

/* TEST.CPP 14: */

/* TEST.CPP 15: */return 0; /* TEST.CPP 16: */

/* TEST.CPP 17: */}

/* TEST.CPP 18: */

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

#include <vector> #ifdef WORKING int x = 1;

#else

int x = 2; #endif

#define X_WORD 32 vector<int> intArray; int main(void)

{

int z = X_WORD + 99;

// Здесь что-нибудь делаем с z return 0;

}

Опять же, здесь нет ничего особенного. Мы просто добавили модуль из библиотеки стандартных шаблонов (STL), но вы, вероятно, будете очень удивлены, как и я, когда увидите, что размер получившегося файла test.i превышает 6 Mбайт. Это, в частности, показывает, почему компиляция программы, использующей STL, происходит намного дольше, чем компиляция программы, не использующей эту библиотеку. Просмотр полученного файла может занять несколько дней. Приятным моментом во всем этом является то, что препроцессор генерирует такой файл всего секунд за 30, а компилятор обрабатывает его ненамного дольше (может быть, чуть меньше минуты), целиком компилируя весь текст в полностью работающую программу.

Один из самых важных случаев, когда используется препроцессор, — выяснение того, почему что-

Соседние файлы в предмете Программирование на C++