Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

ЧАСТЬ 3. Набор инструментальных средств пакета Quick-C

Компилятор Microsoft Quick-C имеет не только интегрированную среду разработки программ; он также включает в себя несколько мощных программных средств, дополняющих интегрированную среду. Настоящий Раздел показывает, как применять данные средства, которые включают: - Компилятор QCL, создающий из исходных СИ-файлов объектные и выполняемые файлы на диске.

- Оверлейный редактор связей LINK, объединяющий объектные файлы и автономные библиотеки в выполняемые файлы или библиотеки Quick. - Утилита LIB, объединяющая объектные файлы в автономные библиотеки. - Утилита поддержки программ MAKE, автоматически обновляющая программу, при изменении какого-либо из ее составных модулей.

ГЛАВА 9. Компиляция и компановка программ.

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

- Вы создаете исходный текст программы на своем собственном редакторе текстов.

- Вы компилируете программы, которые не могут быть скомпилированы в программной среде Quick-C.

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

- Во время компиляции вашей программы вы генерируете специальные команды для процессора 80286.

- Вам требуется листинг либо содержащий вывод препроцессора языка СИ, либо программные сегменты, в порядке появления.

Компилятор Microsoft Quick-C имеет программу с именем QCL, которая компилирует и компанует вашу программу вне среды Quick-C. В следующей Главе показывается, как использовать команду QCL и оверлейный компановщик Microsoft, называемый LINK. Она организована, как показано ниже:

Разделы       Содержание

9.1-9.1.2.    Описывается процесс компиляции и компановки. Прочтите
              данный раздел, если вы незнакомы с языковой продукцией
              фирмы Microsoft Inc.; в противном случае перейдите к
              Разделу 9.2.
9.2-9.3.      Объясняется, как компилировать и компановать программы
              с помощью одной строки команды QCL , и описывает файлы
              и опции, которые поступают на ввод команде QCL.
9.4-9.7.      Объясняется, как компилировать и компановать программы
              в два приема: с помощью компиляции посредством QCL и
              компановки посредством LINK. В данных Разделах описыва-
              ется информация, которую QCL передает программе LINK,
              кроме того список файлов и опции, которые вы можете за-
              дать на входе команды LINK

9.1. Процесс компиляции и редактирования связей.

Создание автономной программы из исходного СИ-файла вне программной среды Quick-C описывает следующая процедура:

1. Каждый исходный файл в программе компилируется, создавая объектный файл.

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

В Разделах 9.1.1. и 9.1.2. описываются два метода, которые вы можете использовать для компиляции и компановки программ.

Рисунок 9.1 иллюстрирует данные методы.

Рисунок 9.1. Компиляция и компановка программ.

9.1.1. Использование одной командной строки QCL.

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

9.1.2. Использование команд QCL и LINK.

В качестве альтернативы вышеописанному способу, вы можете сначала выполнить компиляцию с помощью QCL с опцией /c, затем использоывать команду LINK для прямого вызова компановщика. Преимуществом данного метода является то, что вам не потребуется в одной командной строке, задавать компановщику всю необходимую информацию; команда LINK запросит у вас всю информацию, которую вы не задали. Инструкции по использованию команды LINK смотрите в Разделах 9.4.2.1-9.4.2.4.

9.2. Одношаговая компиляция и редактирование: Команда QCL.

Для компиляции и компановки посредством команды QCL, ваша опера ционная среда DOS должна быть установлена так, как описано ниже: Полное описание смотрите в Разделе 1.3.1.6 (для пользователей систем с жестким диском) или в Разделе 1.3.2.4. (для пользователей систем с гибкими дисками).

- Если вы являетесь пользователем системы с жестким диском, сделайте каталог с вашим исходным файлом текущим с помощью команды DOS CD. - Если вы пользуетесь системой с гибкими дисками, установите дискету с вашей исходной программой в дисковод В, а копию дистрибутивной дискеты PRODUCT в дисковод А. Сделайте дисковод В рабочим. При запуске программы QCL введите имя дисковода А: непосредственно перед командой QCL без разделяющих пробелов. Во время процесса компиляции/компановки, система будет просить вас установливать в дисковод А вашу рабочую копию дистрибутивной дискеты Work и дискету, содержащую соответствующую автономную библиотеку.

Команда QCL имеет следующий формат:

    QCL[[option]]...file...[[option|file]]...[[/link[[lib...link-opt.
..]]]]
Информация, вводимая в командной строке QCL объясняется в следующем списке:

Содержимое             Значение


option                 Опция QCL; смотрите Разделы 9.3.1-9.3.13, опи-
                       сывающие опции. Чтобы получить краткий обзор
                       наиболее часто используемых опций, введите:
                       QCL/HELP и нажмите ENTER.
file                   Имя исходного или объектного файла, передава-
                       емого для обработки; либо имя библиотеки, пе-
                       даваемой редактору связи для обработки. Вам
                       следует задать хотя бы одно имя файла. О за-
                       дании имен файлов в команде QCL смотрите Раз-
                       делы 9.2.1.1-9.2.1.3.
lib                    Имя автономной библиотеки, передаваемой ком-
                       пановщику для обработки. Подробную информацию
                       о задании автономных библиотек смотрите в Раз-
                       деле 9.4.2.3.
link-opt               Одна или более опций компановщика, описанных в
                       Разделах 9.5.1-9.5.14; Команда QCL передает
                       данные опции компановщику. Обычно, вам не нуж-
                       но задавать опции компановщика, если вы не хо-
                       тите, чтобы компановщик выполнял специальные
                       операции, такие как подвязывание специальной
                       библиотеки, изменение размера программного
                       стека, создание файла распределения памяти,
                       либо включение в выполняемый файл отладочной
                       информации.
В командной строке QCL вы можете задать любое количество опций, имен файлов и автономных библиотек, но учтите, что командная строка не должна превышать 128 символов.

9.2.1. Задание имен файлов.

Команда QCL имеет некоторые правила для задания имен файлов, основывающиеся на именах маршрутов и расширений, которые вы используете для данных файлов. Следующие Разделы описывают правила, которым вы должны следовать при задании имен файлов для QCL.

9.2.1.1. Буквы нижнего и верхнего регистра.

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

9.2.1.2. Расширения имен файлов.

Имя файла в операционной системе DOS состоит из двух частей: "базовое имя", то что стоит перед точкой, и "расширение", которое состоит из точки(.) и трех символов после точки. Расширение идентифицирует тип файла.

Команда QCL использует расширение каждого имени файла для опре- деления способа обработки соответствующего файла, как об'ясняется в следующей таблице:

Расширение    Обработка

.C            QCL предполагает, что данный файл является исходным
              СИ-файлом, и компилирует его.
.OBJ          QCL предполагает, что файл является об'ектным, и передает
              его редактору связей для компановки.
.LIB          QCK предполагает,что файл является автономной библиоте-
              кой и передает ее редактору связей для компановки вместе
              со сгенерированными об'ектными файлами, заданными в ко-
              мандной строке.
Любые другие  QCL предполагает,что файл является об'ектным и передает
расширения    его компановщику.
или без расши-
рения.
-Пример:

Командная строка:

    QCL A.C B.C C.OBJ D

компилирует файлы A.C и B.C,создает объектные файлы с именами A.OBJ и B.OBJ. Данные объектные файлы затем компануются вместе с объектными файлами C.OBJ и D.OBJ для формирования выполняемого файла с именем A.EXE (поскольку базовое имя первого файла в командной строке А). Обратите внимание, что для файла D предполагается расширение .OBJ, поскольку в командной строке для него не задано никакого расширения.

9.2.1.3. Наименование маршрутов.

Любой файл может содержать полное или частичное наименование маршрута. Полное имя маршрута начинается со спецификации дисковода; частичное имя маршрута имеет одно или более имен каталогов перед именем файла, но не содержит имя дисковода.

Задание наименования маршрута позволяет вам задавать на вход программе QCL файлы, содержащиеся в различных каталогах, создавать файлы на различных дисководах или в различных каталогах текущего устройства. Для выходных файлов (таких как объектные или выполняемые файлы), которые вы создаете посредством QCL, вы можете задать наименование маршрута, оканчивающееся обратным слэшем (\), что определить создание файла по данному маршруту. При создании файла программа QCL использует для него стандартное имя.

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

9.3. Управление компиляцией с помощью опций QCL.

Опции команды QCL представляют собой либо слэш (/), либо дефис (-), за которыми следует одна или более букв.

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


Важное замечание:

Опции QCL чувствительны к использованию больших и малых букв. Например, /W и /w являются различными опциями.


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

Все опции QCL совместимы с опциями оптимизирующего компилятора Microsoft C версии 5.0.

-Объединение опций в переменной программной среды CL.

Если вы перекомпилируете данный набор файлов более одного раза, или вы используете при компиляции тот же самый набор опций, переменная программной среды CL может спасти вас от повторного ввода файлов и опций в командной строке при каждой компиляции. Для определения переменной CL используйте, как показано ниже, команду DOS SET:

    SET CL=[[option|file]...[/link[link-libinfo]]]
Данная переменная также бывает полезна, если при компиляции вы обычно используете большое количество файлов и опций, поскольку файлы и опции, которые вы определяете в данной переменной, не умещаются в 128-символьный лимит командной строки; те файлы и опции, которые вы часто используете, можно определить в переменной CL, а остальные файлы и опции, нужные вам для специальных целей, задавать в командной строке. Информация, которую вы определяете в переменной CL, будет трактоваться так, как если бы она находилась в командной строке перед информацией, заданной в командной строке QCL. Например, если вы используете командную последовательность в форме:

    SET CL=/ Fm TEST1:C /link LIB1.LIB /PAC
    QCL /Zi TEST2.C /link LIB2.LIB /STOxCOO
эффект будет тот же, как если бы вы ввели в командной строке:
    QCL /Fm TEST1.C /Zi TEST2.C /link LIB1.LIB /PAC
    LIB2.LIB /STOxCOO
Обратите внимание, что если вы определили файл или опцию с помощью CL, вы не сможете отменить ее в командной строке. Вам будет нужно переназначить переменную программной среды CL и пропустить файл или опцию, которую вы не хотите использовать.

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

Большинство опций QCL применимы только к процессу компиляции и не влияют на объектные файлы, заданные на командной строке.

Таблица 9.2 в Разделе 9.3.2. приводит список опций, влияющих на процесс компановки.

-Примеры:

    SET CL=FILE1.C FILE2.C
    QCL FILE3.OBJ
В приведенном выше примере переменная среды CL просит компилятор скомпилировать и скомпановать исходные файлы FILE1.C и FILE2.C. Тогда команда QCL

    QCL FILE1.C FILE2.C FILE3.OBJ

будет иметь тот же самый эффект, что и первая командная строка.

    SET CL=/Za
    QCL FILE1.C/Ze FILE2.C
Пример, приведенный выше, рассказывает как отменить действие опции CL. В данном примере переменной среды CL присваивается опция /Za, описанная в Разделе 9.3.1, указывающая, что компилятор не должен распознать расширения к языку СИ фирмы Microsoft. При действии данной опции ключевые слова, специфичные для Microsoft-C будут трактоваться как обычные идентификаторы.

Команда QCL определяет обратную опцию /Ze, при действии которой компилятор трактует языковые расширения, как зарезервированные слова. Поскольку компиляция с помощью командной строки, приведенной ниже та же самая:

    QCL /Za FILE1.C /Ze FILE2.C,

файл FILE1.C компилируется с выключенными языковыми расширениями, а файл FILE2.C скомпилируется с распознаванием языковых расширений.

9.3.1. Опции программной среды.

Опции командной строки QCL имеют то же самое действие, что и опции, задаваемые в диалоговой рамке Compile. В Таблице 9.1 показаны данные опции QCL, соответствующие опциям рамки Compile, разделы, в которых описываются данные функции и действие каждой опции.

                                                 Таблица 9.1.
              Опции QCL и опции диалоговой рамки Compile.

Опции QCL                Опции Compile             Действие


/C                       OBJ кнопка включена     Создает объектный
                                                 файл на диске.
/D identifier[=[string]] Define text box         Определяет символи-
                                                 ческие константы или
                                                 макрокоманды. Опция
                                                 /D разрешает давать
                                                 до 16 определений,
                                                 если языковые расши-
                                                 рения выключены (оп-
                                                 ция компилятора /Za
                                                 или круглая кнопка в
                                                 интегрированной сре-
                                                 де), и до 17 опреде-
                                                 лений, если языковые
                                                 расширения разрешены
/Cs                      Контрольная рамка       Отменяет контроль на
                         Stack Check выключена   стековые операции.
                         (8.1.4.5.)
/Idirectory              Текстовая рамка Include Сообщает комплятору,
                         (8.1.4.8)               по каким маршрутам
                                                 искать включаемые
                                                 файлы. Каждая опция
                                                 /I определяет различ
                                                 ные каталогиию.
/Ot                      Контрольная рамка опти  Оптимизация времени
                         мизации (8.1.4.7.)      выполнения за счет
                                                 размера программного
                                                 кода.
/Ox                      Контрольная рамка опти  Выполняет максимум
                         мизации (8.1.4.7.) и    оптимизации програм-
                         контрольная рамка Stack мы. Данная опция
                         Check (8.1.4.5.)        включает также опти-
                                                 мизацию по циклам.
                                                 (Подробную информа-
                                                 цию об оптимизации
                                                 по циклам смотрите в
                                                 Разделе 9.3.13.
/W[{0|1|2|3}]            Включение кнопки        Устанавливает уро-
                         Warning Level (8.1.4.1) вень для предупреж-
                                                 дающих сообщений.
/Za                      Выключение контрольной  Устанавливает зап-
                         рамки Language          рет на расширения
                         Extensions (8.1.4.6)    Microsoft-C к стан-
                                                 дарту ANSIC.
/Zd                      Включение контрольной   Получает объектный
                         рамки отладочной инфор- файл, содержащий но-
                         мации (Debug) (8.1.4.3) мера строк записей,
                                                 соответствующие номе
                                                 рам строк в исходном
                                                 файле. Бывает полез-
                                                 на, если вы хотите
                                                 передать объектый
                                                 файл символическому
                                                 отладчику SYMDEB.
                                                 Данный отладчик ис-
                                                 пользует эти номера
                                                 для определения мес-
                                                 тоположения в прог-
                                                 рамме внешних симво-
                                                 лических имен, одна-
                                                 ко, он не может это-
                                                 го сделать для лока-
                                                 льных символических
                                                 имен.
/Zi                      Включение контрольной   Помещает в объектный
                         рамки Debug (8.1.4.3.)  файл информацию, тре
                                                 буемую для отладки;
                                                 позволяет использо-
                                                 вать данный файл для
                                                 отладчика Quick-C,
                                                 либо для символичес-
                                                 кого отладчика
                                                 Microsoft Code View.
                                                 Для использования
                                                 программы отладчиком
                                                 Quick-C, опция /Zi
                                                 должна быть задана
                                                 вместе с опциями /Zd
                                                 и /Zq.
/Zq                      Включение контрольной   Генерирует прерыва-
                         рамки Debug (8.1.4.3.)  ния, требуемые для
                                                 отладки Quick-C.
/Zr                      Включение контрольной   Производит проверку
                         рамки Pointer Check     на нулевые указате-
                         (проверка указателей)   ли, выходящие за до-
                         (8.1.4.4.)              пустимые пределы.
/Zs                      Включение кнопки        Только проверка син-
                         Syntax Check Only       таксиса программы.
                         (8.1.4.2.)              Объектный файл не
                                                 создается.
Подробно действия данных опций описываются в Разделе 8.1.4.

9.3.2. Опции, управляющие компановкой.

Несколько опций QCL влияют на процесс компановки, а не компиляции. Данные опции имеют то же самое действие, что и запросы поля командной строки или опции команды LINK. В Таблице 9.2 даны опции QCL, соответствующие средствам команды LINK и их действию.

                                                 Таблица 9.2.

                           Опции QCL и LINK.

Опция QCL     Опция LINK     Действие


/F hexnum     /STACK:number  Устанавливает размер стека для программы
                             (смотрите Раздел 9.5.11).
/Fe[exefile]  Запрос Run     Именует выполняемый файл (смотрите Раз-
              File или поле  дел 9.4.2.2).
              exefile
/Fm[mapfile]  Запрос         Создает файл карты распределения памяти,
              List File или  содержащий описания, расположенных по
              опция /MAP     порядку программных сегментов (смотрите
                             Раздел 9.5.10). Опция /Fm позволяет вам,
                             по желанию, переименовать файл карты рас-
                             пределения памяти.

9.3.3. Распечатка опций компилятора (/HELP).

-Опция.

    /HELP
    /help

Данная опция выводит список наиболее часто используемых опций компилятора. Команда QCL обрабатывает всю информацию в строке, содержащей опцию /help и высвечивает информацию о команде. Данная опция не чувствительна к использованию больших и малых букв принимается любая комбинация букв верхнего и нижнего регистра. Например, /HELP также является корректной формой данной опции.

9.3.4. Задание имени объектного файла (/Fo).

-Опция.

    /Foobjfile.

Опция /Fo присваивает объектным файлам различные имена, либо, если вы определите маршрут, создает их в другом каталоге.

Применяя данную опцию, помните следующие правила:

- Аргумент objfile должен стоять непостредственно за опцией, без разделяющих пробелов.

- Каждая опция /Fo применяется к исходному файлу, следующему за данной опцией в командной строке.

Для файла objfile вы можете задать любое имя и любое расширение. Однако, рекомендуется использовать принятое расширение .OBJ, поскольку компановщик и программа управления библиотеками LIB при обработке объектных файлов пользуются стандартным расширением .OBJ.

Если в опции /Fo вы не задали полного имени объектного файла (то есть, если вы не задали имя объектного файла с базой и расширением, либо вы задали имя маршрута без имени файла), программа QCL назовет объектный файл соответственно следующим правилам:

- Если вы задали имя объектного файла без расширения (как, например, TEST), программа QCL автоматически добавит расширение .OBJ. - Если вы задали имя объектного файла с пустым расширением (как, например TEST.), QCL оставит расширение пустым.

- Если вы зададите маршрут без имени файла, QCL создает объектный файл в каталоге с данным маршрутом, дает ему базовое имя, соответствующее имени первого исходного файла в командной строке, и прибавит расширение .OBJ.

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

-Примеры:

    QCL /Fob:\OBJECT\ FILE1.C

В примере, приведенном выше, компилируется исходный файл FILE1.C; результирующий объектный файл именуется FILE1.OBJ (стандартно). Спецификация каталога B:\OBJECT сообщает QCL, что файл FILE1.OBJ нужно создать в каталоге \OBJECT на устройстве B.

    QCL /Fo\OBJECT\FILE1.C FILE2.C/Fo\SRC\NEWFILE3.OBJ FILE3.C
В приведенном выше примере, первая опция /Fo просит компилятор создать в каталоге \OBJECT объектные файлы FILE1.OBJ (получаемый в результате компиляции FILE1.C) и FILE2.OBJ (получаемой в результате компиляции FILE2.C). Вторая опция /Fo сообщает компилятору, что объектный файл с именем NEWFILE3.OBJ (полученный в результате компиляции FILE3.C) следует создать в каталоге \SRC.

9.3.5. Опции модели памяти (/A) и операций с плавающей точкой (/FP).

В команде QCL существуют две следующих важных опции:

1. Модель памяти, используемая вашей программой.

2. Способ, каким ваша программа обрабатывает операции с плавающей точкой.

Модель памяти определяет правила, по которым компилятор формирует в памяти программный код и сегменты данных. QCL предлагает следующие модели памяти, описанные в Таблице 9.3.

                                                 Таблица 9.3.

                            Модели памяти.

Опция CL  Модель памяти  Сегменты данных        Сегмент кода


/AS       малая          один                   один
/AM       средняя        один                   один сегмент кода
                                                для каждого модуля.
/AC      компактная    несколько сегментов дан- один
                       ных; элементы данных дол-
                       жны быть меньше, чем 64К
/AL      большая       несколько сегментов дан- один сегмент кода для
                       ных;элементы данных дол- модуля
                       жны быть меньше, чем 64К.
ОБычно, модели памяти с несколькими сегментами кода могут давать в результате программы большие, чем модели памяти с одним сегментом кода; а также модели памяти с несколькими сегментами данных могут создавать программы со значительно большим количеством данных, чем модели памяти с одним сегментом данных. Однако, программы с несколькими сегментами кода или данных обычно работают медленнее, чем программы с одним сегментом кода или данных.

По умолчанию компилятор Microsoft Quick-C для программ, компилируемых в среде Quick-C, использует среднюю модель памяти, и малую модель памяти, для программ, компилируемых с помощью команды QCL. (Более подробную информацию об использовании и регулировании моделей памяти, смотрите в Приложении В "Работа с моделями памяти пакета Quick-C"). Команда QCL имеет следующие опции, позволяющие вам выбрать способ, каким компилируемая вами программа будет обрабатывать математические операции с плавающей точкой:

Опция  Действие


/FPi   Обрабатывает операции с плавающей точкой  с помощью програм-
       ного обеспечения, эмулирующего работу математического сопро-
       цессора 8087 или 80287. Чтобы выполнять программы с данной оп-
       цией, вам не нуже реальный математический сопроцессор, хотя
       такая программа будет успешно работать и на системах с сопро-
       цессором.Данная опция стандартна.
/FPi87 Обрабатывает математические операции с плавающей точкой с по-
       мощью генерации инструкций для математического сопроцессора
       8087 или 80287. Использование данной опции сокращает размер
       программы, но программа всегда будет работать только на систе-
       мах, имеющих сопроцессор.
Выбранные вами опции операций с плавающей точкой и модели памяти определяют автономную библиотеку, подсоединяемую программой QCL к создаваемому объектному файлу. Если вы хотели подвязать даннюу библиотеку в процесс компановки, вам не нужно задавать компановщику ее имя. В Таблице 9.4 изображены все комбинации модели и соответствующие этим комбинациям имена библиотек, вставляемые командой QCL в объектный файл.

                                                 Таблица 9.4.

                  Опции QCL и стандартные библиотеки.

Опция операции с пла-  Опция модели памяти       Стандартная библио-
вающей точкой                                       тека


/FPi87                 /AS                       SLIBC7.LIB
                       /AM                       MLIBC7.LIB
                       /AC                       CLIBC7.LIB
                       /AL                       LLIBC7.LIB
/FPi                   /AS                       SLIBCE.LIB
                       /AM                       MLIBCE.LIB
                       /AC                       CLIBCE.LIB
                       /AL                       LLIBCE.LIB

9.3.6. Применение процессора 8086 или 808286 (/G0, /G2).

-Опции:

/G0   Устанавливает набор инструкций для процессора 8086/8088 (стан-
      дартно).
/G2   Устанавливает набор инструкций для процессора 80286.
Если вы пользуетесь микропроцессором 80286, вы можете указать опцию /G2-чтобы установить для вашей программы набор 80286. По умолчанию, компилятор Microsoft Quick-C использует набор инструкций для микропроцессора 8086/8088. Хотя на машине с микропроцессором 80286 желательно компилировать с опцией /G2, вам это не обязательно, поскольку программы, скомпилированные с опцией /G2, не смогут работать на машинах с микропроцессорами 8088 или 8086. Однако, программы, скопилированные без опции /G2, либо программы, явно скомпилированые с опцией /G0, могут работать на машинах с микропроцессором 80286.

9.3.7. Управление препроцессором.

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

9.3.7.1. Удаление определений стандартно предопределенных идентификаторов (/U, /u).

-Опции

/U identifier Удаляет определение стандартно заданного идентификато-
              ра identifier.
/u            Удаляет определвние ВСЕХ стандартно заданных иденти-
Компилятор Microsoft Quick-C определяет четыре идентификатора, являющихся полезными при написании переносимых программ. Данными идентификаторами следует пользоваться для компиляции частей программы, зависящих от используемых процессора, операционной системы, модели памяти. Стандартно определенные идентификаторы и их значения приведены ниже:

Идентификатор Функция

MSDOS                  Всегда определен. Идентифицирует операционную
                       систему, как DOS.
M_186                  Всегда определен. Идентифицирует машину, как
                       относящуюся к семейству микропроцессоров 8086.
M_186mM                Всегда определен. Идентифицирует модель памя-
                       ти, где m-это либо S (малая модель), C (ком-
                       пактная модель), M (средняя модель), L (боль-
                       шая модель). Использование моделей памяти под-
                       робно обсуждается в Приложении В "Работа с мо-
                       делями памяти пакета Quick-C".
NO_EXT_KEYS            Определяется, только если языковые расширения
                       не разрешены (то есть если программы компили-
                       руются с выключенной круглой кнопкой Language
                       Extensions, либо с опцией компилятора /Za.
Опция /U (отменить определение) выключает определение данного стандартно заданного идентификатора. Опцию /U и параметр identifier могут отделять один или более пробелов. В одной командной строке можно задать более одной опции /U. Опция /u выключает все четыре определения. Удалить определения стандартных идентификаторов вам может понадобиться в следующих случаях:

- Если вы хотите задать в командной строке более, чем максимально разрешенное число определений. Если языковые расширения отменены, вы можете задать 16 определений, и 17 определений в противном случае. - Если вы хотите, чтобы в вашей программе стандартный идентификатор обозначал что-нибудь другое.

Взамен каждого удаленного стандартного идентификатора вы можете в командной строке подставить определение своего собственного. Если вы удалите определения всех четырех стандартных идентификаторов, вы можете определить до двадцати определений командной строки. Однако, поскольку DOS ограничивает количество символов, которые можно задать в командной строке, количество определений, которые вы можете задать , на практике значительно меньше, меньше 20.

-Пример:

    QCL /UMSDOS /UM_186 WORK.C

Данный пример удаляет определения двух стандартных идентификаторов. Заметим, что для выполнения этого опция /U должна быть задана дважды.

9.3.7.2. Вывод листинга препроцессора (/P, /E, /EP).

-Опции:

/P    Записывает вывод препроцессора в файл.
/E    Направляет вывод препроцессора в стандартный выходной поток;
      подключает директивы #line.
/EP   Записывает вывод препроцессора в файл и в стандартный выходной
      поток.
Опции /P,/E и /EP выводят листинг файла после обработки препроцессором. Использование данных опций позволяет вам проверить вывод препроцессора языка СИ. Все три опции подавляют компиляию; не производится ни объектного файла, ни карты распределения памяти, даже если в командной строке QCL будут заданы опции /Fo или /Fm. Листинг препроцессора идентичен оригинальному исходному файлу, за исключением того, что все директивы препроцессора выполняются, также расширяются все макрокоманды, а комментарии удаляются.

В следующей Таблице вы увидите, как каждая из опций влияет на вывод препроцессора:

Опция  Вывод препроцессора

/P    Записывает вывод препроцессора в файл с тем же самым базовым
      именем, что и исходный файл, но с расширением .I.
/E    Копирует листинг препроцессора на стандартное выводное устройс-
      тво (обычно ваш терминал); для записи листинга в файл на диск
      вы можете использовать переадресацию DOS. Также данная опция
      помещает директивы #line в начало и конец каждого включаемого
      файла и вокруг строк, удаленных директивами препроцессора, за-
      дающими условную компиляцию. Данная опция бывает полезна, если
      вы перед компиляцией хотите промотреть листинг препроцессора.
      Директивы #line перенумеровывают строки файла, полученного пос-
      ле работы препроцессора, поэтому ошибки, сгенерированные на бо-
      лее поздних стадиях обработки, относятся к оригинальному исход-
      ному файлу, а не к файлу, полученному после обработки препроце-
      ссором.
/EP   Объединяет действие опций /E и /P: помещает листинг препроцес-
      сора в файл и копирует его на стандартное устройство вывода, но
      не добавляет директивы #line.
-Примеры:

    QCL /P MAIN.C

Данный пример создает листинг препроцессора MAIN.I и помещает в файл на диске с исходным файлом MAIN.C.

    QCL /E ADD.C >PREADD.C

Приведенная выше команда создает препроцессорный файл с включенными директивами #line из исходного файла ADD.C. Вывод переадресуется в файл PREADD.C.

    QCL /EP ADD.C

Данная команда производит тот же самый препроцессорный вывод, что и во втором примере, но без директив #line. Вывод появляется на экране.

9.3.7.3. Соxранение комментариев (/C).

-Опция:


Опция /C ("комментарий") сохраняет комментарии во время обработки файла препроцессором.

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

Данная опция действует только, если одновременно используется одна из опций /E,/P, или /EP.

-Пример:

    QCL /P /C SAMPLE.C

Данный пример производит листинг с именем SAMPLE.I. Файл-листинг содержит оригинальный исходный файл, включая комментарии, со всеми директивами препроцессора, расширенными, либо замененными.

9.3.7.4. Поиск включаемых файлов (/X).

-Опция:

    /X

Опция /X просит компилятор не искать включаемые файлы в "стандартных местах", определяемых переменной операционной среды DOS INCLUDE. Данная опция позволяет вам изменить порядок, в котором компилятор ищет включаемые файлы без изменения среды компилятора, используемой вами обычно.

Опция /X часто используется обычно вместе с опцией /I, которая сообщает компилятору, где, если не в стандарных местах, искать включаемые файлы. Информацию о задании каталогов, отличных от стандартных мест, в которых обычно находятся включаемые файлы, ищите в Разделе 8.1.4.1, "Подавление сообщений компилятора: Опции уровней предупреждений" и Разделе 9.3.1, "Опции программной среды". -Пример:

    QCL /X MAIN.C

В приведенном выше примере компилятор ищет подключаемые файлы в текущем рабочем каталоге, поскольку опция /X сообщает программе QCL, что список обычных стандартных мест пуст.

9.3.8. Подготовка к отладке (/Zi, /Zd).

-Опции:

/Zi Создание объектного файла для отладки в программной  среде/отла-
    дчик Code View.
/Zd Создание объектного файла с  ограниченной отладочной
    информаци- ей.
Опция /Zi производит объектный файл, содержищий информацию для отладки в символических адресах-для использования встроенным отладчиком в программной среде Quick-C, либо символическим отладчиком Code View. Данный объектный файл содержит полную таблицу символических адресов и номера строк.

Опция /Zd производит объектный файл, содержащий номера строк, соответствующие номерам строк исходного файла. Опция /Zd полезна в тех случаях, когда вы хотите уменьшить размер выполняемого файла, который вы будете отлаживать с помощью отладчика Code View, и вам в процессе отладки не понадобится использовать вычисление выражений.

-Пример:

    QCL /Zi TEST.C

Данная команда производит объектный файл с именем TEST.OBJ, который содержит номера строк, соответствующие номером строк файла TEST.C.

9.3.9. Упаковка членов структуры (/Zp).

-Опции:

    /Zp[{1|2|4}]
    #pragma pack ([{1|2|4}])
При размещении структуры в памяти, члены структур обычно зранятся следующим образом:

- Элементы типа char или unsigned char, либо массивы, содержащие элементы данных типов, выравниваются на границу байта.

- Структуры выравниваются на границу слова; структуры нечетного размера дополняются до четного количества байтов.

- Все остальные типы членов структур выравнивабтся на границу слова. Для экономии памяти вам может понадобиться хранить структуры более или менее стандартно. Опция /Zp и директива pragma pack управляют тем, как данные структуры "упаковываются" в памяти. Заметим, что на некоторых процессорах, опции /Zp может замедлить выполнение программ, поскольку требуется время при доступе к структурам для их распаковки.Например, на микропроцессоре 8086 данная опция может снизить эффективность, если члены структур типов int или long упаковываются таким способом, что они начинаются на границе нечетного байта.

Пользуйтесь опцией /Zp, чтобы определить аналогичную упаковку для всех структур в модуле. Если вы зададите опцию /Zp[n], где n-это 1,2 или 4, каждый член структуры после первого хранится на границе n-ого байта в зависимости от выбранной вами опции. Если вы используете опцию /Zp без аргумента, члены структур упаковываются на 1-байтовой границе. Используйте директиву pragma pack, если вы хотите определить упаковку иную, чем упаковка, определенная в командной строке для определенных структур. Задайте pragma pack(n) где n-это 1,2, или 4, перед описанием структур, которые вы хотите упаковать различным способом. Чтобы восстановить упаковку, заданную в командной строке, задайте pragma pack() без аргументов.

    Таблица 9.5  показывает взаимодействиеопции  /Zp и  директивы pragma
pack. Таблица 9.5.

                 Использование директивы pragma pack.

Синтаксис              Компиляция с опцией /Zp   Действие


#pragma pack()         да                        Возвращает к упаков-
                                                 ке заданной в коман
                                                 дной строке для сле-
                                                 дующих за ней струк-
                                                 тур.
#pragma pack()         нет                       Возвращает к стандар
                                                 тной упаковке для
                                                 структур, следующих
                                                 за ней.
#pragma pack(n)        да или нет                Упаковывает следую-
                                                 щие далее структуры
                                                 по заданной байтовой
                                                 границе до тех пор,
                                                 пока не будет изме-
                                                 нений или выключе-
                                                 ний.
-Пример:

    QCL /Zp PROG.C

По данной команде все структуры в программе PROG.C будут храниться без дополнительного места для выравнивания ее членов по границе int.

9.3.10. Подавление выбора стандартной библиотеки (/Zl).

-Опция:

    /Zl

Обычно, программа QCL помещает в объектный файл имя стандартной библиотеки SLIBCE.LIB. Данный механизм позволяет редактору связей автоматически находить соответствующую библиотеку и подвязывать ее к объектному файлу.При заданной опции /Zl компилятор не будет помещать в объектный файл имя стандартной библиотеки. В результате, объектный файл будет значительно меньше.

Опция /Zl бывает полезна, когда вы используете утилиту LIB (описанную в Разделе 10.2) для построения автономной библиотеки. Вы можете скомпилировать объектные файлы, помещаемые вами в библиотеку, с опцией /Zl, для того, чтобы удалить имена библиотек перед их объединением. Кроме того, опция /Zl сэкономит небольшое количество памяти для каждого объектного файла, значительно большое количество памяти будет сэкономлено в библиотеке, содержащей много объектных модулей.

-Пример:

    QCL ONE.C /Zl TWO.C

Пример, приведенный выше создает следующие два объектных файла: - Объектный файл ONE.OBJ, содержащий имя СИ-библиотеки SLIBCE.LIB. - Объектный файл TWOO.OBJ, не содержащий стандартной информации о библиотеках.

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

9.3.11. Управление соглашениями о связях (/Gc).

-Опция:

      /Gc
      fortran
      pascal
      cdecl
Ключевые слова fortran, pascal, cdecl вместе с опцией /Gc управляют соглашениями о вызове и наименовании функций, используемые вашими программами для того, чтобы они могли вызывать или могли сами быть вызваны функциями, написанными на языке Pascal, FORTRAN, BASIC с использование средств фирмы Microsoft.

9.3.12. Установка границы данных.

-Опция:

    /Gt[number]

При использовании опции /Gt, все элементы данных, размер которых больше или равен number байтов, будут размещаться в новом сегменте данных. Если число number задано, оно должно непосредственно следовать за опцией /GT, без каких-либо разделяющих пробелов. Если число number опущено, стандартное пороговое значение 256. Если опция /Gt опущена, стандартное пороговое значение 32767.


Примечание:

Опцию /Gt можно использовать только для программы, разработанной в компактной или большой модели памяти, поскольку программы в малой или средней модели памяти имеют только один сегмент данных.


9.3.13. Оптимизация циклов (/Ol).

-Опция:

    /Ol

Опция /Ol требует компилятор выполнять оптимизацию по циклам. Если вы выберете данную опцию, компилятор автоматически поместит часто используемые переменные цикла в регистры, для того. чтобы ускорить выполнение программы.

Данная опция будет неявно включена, если вы будете использовать опцию /Ox (максимально возможная оптимизация).

9.4. Раздельная компиляция и компановка: Команды QCL и LINK.

С помощью компилятора Microsoft Quick-C вы можете осуществлять компановку несколькими различными способами. Данные методы описываются в Разделах 9.4.1-9.4.2. Для каждого из методов вы задаете редактору связей следующую информацию:

- Объектные файлы, которые вы компануете.

- Имена библиотек, которые вы подвязываете, если они отличаются от стандартных.

- Имя выполняемого файла, если вы хотите переименовать его, либо использовать расширение, отличное от .EXE.

- Наименование файла карты распределения памяти, если вы хотите его создать.

- Опции компановщика, если они имеются, управляющие процессом компановки.

Для того, чтобы осуществлять компиляцию в и компановку два отдельных шага, используйте команду QCL для компиляции исходных файлов без компановки результирующих объектных файлов. В командной строке QCL задайте опцию /c и имена исходных файлов.. Затем скомпануйте в отдельном шаге результирующие объектные файлы с соответствующими библиотеками, применив нужные опции редактирования связей.

9.4.1. Компановка с помощью команды QCL.

Для компановки с использованием команды QCL используйте следующий синтаксис:

    QCL[option...]objfile...[lib...]/link link-option...lib...
Как описано в Разделе 9.2, команда QCL, если вы в командной строке задайте только имена объектных файлов, пропустит компиляцию и вызовет компановщик. Команда QCL передаст компановщику имена объектных файлов, имена библиотек и опции компановщика.

9.4.2. Компановка с помощью команды LINK.

Если вы осуществляете компановку отдельным шагом, альтенативой использования команды QCL является вызов редактора связей непосредственно командой LINK. Это можно сделать после компиляции посредством команды QCL с опцией /c.

Для компановки посредством команды LINK, операционная среда DOS должна быть установлена так, как описано ниже. Полное описание смотрите в Разделе 1.3.1.6 (для пользователей жесткого диска) или Раздел 1.3.2.4 (для пользователей гибких дисков.).

- Если вы запускаете команду LINK на системе с жестким диском, воспользуйтесь командой DOS CD для того, чтобы сделать каталог с объектными файлами, предназначенными для компановки, текущей. - Если вы работаете с программой LINK на системе с гибкими дисками, диск, содержащий ваши объектные файлы, должен быть устиновлен в дисководе B, а рабочая копия вашего дистрибутивного диска в дисководе A. Сделайте дисковод B текущим. Когда вы запускаете программу LINK, введите спецификацию дисковода А: непосредственно перед командой LINK без каких-либо промежуточных пробелов. Во время процесса компановки система будет предупреждать вас о замене в дисководе A рабочей копии вашего дистрибутивного диска на диск, содержащий соответствующую автономную библиотеку.

Вход для программы LINK вы можете задать одним из следующих способов:

Метод                  Инструкции

Задание входной инфор- Используйте командную строку в следующей фор-
мации в командной      ме:
строке.                LINK objfile[,[exefile] [,[mapfile][,[lib]...
                       ]]][link-opt]...[;]
                       Командная строка не может быть длиннее 128 сим
                       волов.
Ответ на запросы       Введите:
                       LINK
                       и ответьте на следующие запросы:
                       Object Modules [.OBJ]: -объектные модули
                       Run File [basename.EXE]: -исполняемые файлы
                       List File [NUL.MAP]: -листинг памяти
                       Libraries [.LIB]: -библиотеки
                       Чтобы задать больше файлов для одного запроса,
                       введите в конце строки знак +. Запрос снова
                       появится на следующей строке и вы можете про-
                       должить ввод для следующего запроса.
Создание файла         Создайте файл с ответами на запросы команды
ответов                LINK, известный под названием "файл ответов",
                       затем введите команду LINK в следующей форме:
                       LINK @ filename  , где
                       filename-это имя файла ответов. К любому отве-
                       ту вы можете добавить опции компановщика, либо
                       задать их в одной или более отдельных стро-
                       ках. Ответы вы должны задавать в том же поря-
                       дке,что и запросы LINK, описанные выше. Вы мо-
                       жете также ввести наименование файла ответов
                       после любого запроса компановщика, либо в лю-
                       бой позиции командной строки LINK.
В Таблице 9.6 приведены примеры входной информации, задаваемой в командной строке LINK, либо ответы на запросы команды LINK.
                                                 Таблица 9.6.

                 Входная информация для команды LINK.

Поле     Запрос        Входная информация


objfile  Object        Один или более объектных файлов, которые вы
         Modules       связываете, отделяются знаком плюс или пробе-
                       лами. В данном поле вы также можете определить
                       библиотеки; в данном случае, все объектные мо-
                       дули в библиотеке связываются с остальными
                       объектными модулями, заданными в данном поле.
exefile Run File       Имя создаваемого вами выполняемого файла, если
                       вы хотите дать ему имя или расширение, отлич-
                       ное от стандартного. Вам всегда следует исполь-
                       зовать файлы, имеющие данное расширение.
mapfile  List File     Имя файла, содержащее листинг символических
                       адресов (карту распределения памяти), если вы
                       ее используете. Кроме того, вы можете задать
                       одно из следующих адресов устройств, поддержи-
                       ваемых DOS-для того, чтобы направить данный
                       файл на  одно из этих устройств: AUX-для до-
                       полнительного устройтсва, CON для консоли (те-
                       рминала), PRN для принтера, NUL (нет устройст-
                       ва), то есть файл карты не создается. В Раз-
                       деле 9.5.10. приведен пример карты распределе-
                       ния памяти и дается информация о ее содержа-
                       нии. (Файл карты вы можете создать с помощью
                       опции команды QCL/Fm (Раздел 9.3.2), либо с
                       помощью опции /MAP команды LINK.
lib       Libraries    Одна или более автономных библиотек, либо ка-
                       талогов, в которых будут искаться автономные
                       библиотеки, отделенные друг от друга знаками
                       плюс или пробелами. Вы можете задать до 32 биб-
                       лиотек в ответе на запрос о библиотеках; все
                       остальные дополнительные библиотеки игнориру-
                       ются. В Разделе 9.4.2.3 заданы правила для за-
                       дания имен библиотек при компановке.
link-opt  Задавайте    Любые из опций компановщика, описанные в Раз-
         опции после   лах 9.5.1-9.5.14. Опции можно задать в любом
         любого отве-  месте командной строки.

9.4.2.1. Стандартная информация для программы LINK.

Стандартную информацию для команды LINK вы можете выбрать одним из следующих способов:

Тип стандартной        Как выбрать
информации

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


    В следующей Таблице показаны стандарты имен, которые программа  LINK
использует для  выполняемых файлов,  файлов карт  распределения памяти и
библиотек:

Тип файла              Стандарт


Выполняемый            Дается базовое имя первого объектного файла
                       плюс расширение .EXE. Чтобы переименовать вы-
                       полняемый файл, задайте только новое базовое
                       имя; если вы зададите имя файла без расшире-
                       ния, программа LINK автоматически добавит рас-
                       ширение .EXE.
Файл распределения     Специальный файл с именем NUL.MAP, который со-
памяти                 общает команде LINK, что файл распределения
                       памяти создавать не нужно. Для создания файла
                       распределения памяти задайте только базовое
                       имя; если вы зададите имя файла без расшире-
                       ния, программа LINK автоматически добавит рас-
                       ширение .MAP.
Библиотеки             Имена библиотек задаются в объектных файлах.
                       Имена библиотек, помещаемые в объектные файлы,
                       зависят от опций плавающей точки и модели па-
                       мяти, заданных при компиляции исходных файлов;
                       список стандартных имен библиотек приведен в
                       Таблице 9.4. Если вы хотите определить имя
                       библиотеки, отличное от стандартного, задайте
                       только базовое имя; если вы зададите имя биб-
                       лиотеки без расширения, программа LINK автома-
                       тически добавит расширение .LIB. В Разделе
                       9.4.2.3 вы найдете подробную информацию об оп-
                       ределении библиотек, отличных от стандартных.
-Примеры:

    STDEV SQROOT EXP
    /PAUSE /MAP
    STDVLST
    MATHFN.LIB
Данный файл ответов сообщает программе LINK, что следует загрузить три объектных модуля STDEV, SQROOT и EXP. Будут созданы выполняемый файл STDEV.EXE и файл карты STDVLST.MAP. Опция /PAUSE указывает, что программа LINK должна прервать работу перед созданием выполняемого файла для того, чтобы вы могли, если необходимо, сменить гибкий диск. Опция /MAP сообщает компановщику, что следует включить в файл распределения памяти внешние символические имена и адреса типа PUBLIC. Кроме того, программа LINK подвязывает из библиотечного файла MATHFN.LIB все требуемые процедуры. Опция /PAUSE подробно описывается в Разделе 9.5.2, а опция /MAP в Разделе 9.5.10.

    LINK STDEV+SQROOT+EXP, ,STDVLIST, MATHFN.LIB
В приведенном выше примере программа LINK загружает и связывает объектные модули STDEV.OBJ, SQROOT.OBJ и EXP.OBJ, причем неразрешенные ссылки ищет в библиотечном файле MATHFN.LIB. По умолчанию, выполняемый файл получит имя STDEV.EXE. Будет создан файл распределения памяти с именем STDVLIST.MAP.

    LINK.
    Object Modules [.OBJ]: STDEV SQROOT EXP INP+
    Object Modules [.OBJ]: READDATA+GRAPH+PRINT+
    Object Modules [.OBJ]: REPORT
    Run File [STDEV.EXE]: ;
Данный пример показывает, как продолжить любое сообщение с помощью ввода в конце ответа плюса (+). В данном примере связываются все данные объектные файлы и создается выполняемый файл. Поскольку в качестве ответа на запрос Run File была введена просто точка с запятой, выполняемому файлу будет присвоено по умолчанию базовое имя первого объектного файла (STDEV) плюс расширение .EXE. Стандартные значения используются также и для остальных запросов: то есть файл распеделения памяти не создается, и для компановки будут взяты стандартные имена библиотек в объектных файлах.

9.4.2.2. Задание файлов для программы LINK.

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

9.4.2.3. Задание библиотек для программы LINK.

Обычно, задавать компановщику имя автономной библиотеки не требуется. Когда команда QCL создает объектные файлы, она помещает в каждый объектный файл имя подходящей для него автономной библиотеки. QCL определяет имя соответствующей библиотеки по опциям модели памяти и плавающей точки, заданных в командной строке QCL, как описано в Таблице 9.4 (Раздел 9.3.5). Как только объектный файл передается компановщику, компановщик ищет библиотеку с именем, совпадающим с именем в объектном файле, и автоматически связывает ее с объектным файлом. Чтобы связать объектные файлы с библиотеками, отличными от стандартных, вам следует сообщать компановщику, какие библиотки вы хотите подвязать. Имена библиотек вы можете задать в любом из следующих мест:

- В командной строке QCL. Имена библиотек, стоящие перед ключевым словом /link должны иметь расширения .LIB; имена библиотек, стоящие после /link могут совсем не иметь расширений.

- В четвертом поле командной строки LINK.

- В ответе на запрос Libraries команды LINK.

Для разрешения внешних ссылок компановщик сначала ищет заданные вами библиотеки, а затем стандартные библиотеки.

Вам может понадобиться подвязать автономную библиотеку, отличную от стандартной в следующих случаях:

- Если вы хотите подвязать дополнительные автономные библиотеки. Например, если вы не включили при построении библиотек с помощью программы SETUP графические функции, вам следует связать графические программы с автономной графической библиотекой GRAPHICS.LIB, в дополнение к стандартным библиотекам.

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

1. Текущий рабочий каталог.

2. Любые маршруты или дисководы, которые вы задаете, когда обычным способом задаете имена библиотек. Данные маршруты или дисководы могут быть заданы после опции /link в командной строке QCL, либо в четвертом поле командной строки LINK, либо в ответе на запрос Libraries команды LINK.

3. Местоположение, заданное переменной программной среды LIB. - Вы хотите проигнорировать библиотеку, названную в объектном файле; например, если вы хотите подвязать отдельные библиотеки, как описано в Разделе 1.4. В данном случае вам в дополнение к заданной библиотеки, которую вы хотите использовать для компановки, следует задать и опцию компановщика /NOD. Подробности об использовании опции /NOD вы найдете в Разделе 9.5.7.

-Пример:

    QCL STDEV SQROTT EXP /link C:\TESTLIB\NEWLIBV3
Данный пример связывает три объектных модуля для создания результирующего выполняемого файла STDEV.EXE. Перед поиском стандартных библиотек для разрешения внешних ссылок, компановщик ищет, в первую очередь NEWLIBV3.LIB. Чтобы обнаружить местоположение библиотеки NEWLIBV3.LIB, компановщик сначала просматривает текущий рабочий каталог, затем каталог C:\TESTLIB\, и, наконец, по маршрутам, заданным переменной программной среды LIB.

9.4.2.4. Требования к памяти программы LINK.

Для сеанса редактирования связей программа LINK использует доступную память. Если файлы, связываемые для создания выходного файла, превышает имеющуюся оперативную память, программа LINK создает временный файл в каталоге, заданном с помощью переменной среды TMP. Например, если переменная TMP установлена, как C:\TEMPDIR, то программа LINK помещает временный файл в каталог C:\TEMPDIR. Если переменная среды TMP не задана, либо, если каталог, заданный с помощью переменной TMP не существует, программа LINK поместит временный файл в текущий рабочий каталог.

В зависимости от версии операционной системы DOS, временный файл обрабатывается одним из следующих способов:

1.При запуске операционной системы DOS версии 3.0 или выше, программа LINK использует системный вызов DOS для создания временного файла с уникальным именем.

2.При работе с помощью версии DOS ниже 3.0, программа LINK создает временный файл с именем VM.TMP.

При создании временного файла программа LINK выводит сообщение: Temporary file tempfile has been created

Do not change diskette in drive letter,

где tempfile-это ".\", за которым следует либо VM.TMP, либо имя, сгенерированное системой DOS, а letter-это спецификация устройства, на котором создан временный файл.

Если устройство со спецификацией letter является дисководом для гибких дисков, появится также сообщение "Do not change diskette in drive letter." Если оно появилось, не вынимайте дискету из данного устройства, пока не окончится сеанс редактирования связей.

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

    L1087: unexpected end-of-file on scratch file
(Неожиданный конец удаляемого файла)

Если вы увидите такое сообщение ,стартуйте компановщик заново. Временный файл, создаваемый программой LINK-это только рабочий файл. LINK удаляет его в конце сеанса работы.

9.5. Использование опций компановщика.

Все опции компановщика начинаются со знака опции (/). В опциях компановщика буквенный регистр не играет существенной роли; например, /NOI и /noi эквивалентны.

Чтобы сократить место и вашу работу сокращайте опции компановщика. Однако, удостоверьтесь, что ваше сокращение уникально, и компановщик сможет распознать, какую опцию вы имеете в виду. (Минимальная аббревиатура каждой опции определяется ее синтаксисом). Например, некоторые опции начинаются с буквенного сочетания "NO"; таким образом, чтобы быть уникальной, аббревиатура данной опции должна быть длиннее, чем "NO". Вам нельзя использовать сокращение "NO" для опции "/NOIGNORECASE", поскольку компилятор не сможет распознать, какую из опций, начинающихся на "NO", вы имеете в виду. Кратчайшая корректная аббревиатура для данной опции будет "/NOI".

Аббревиатура должна начинаться с первой буквы опции и должна продолжаться до последней введенной буквы. Никакие искажения и пропуски не допускаются.

Некоторые из опций компановщика имеют числовые аргументы. Числовой аргумент может быть одним из следующих:

- Десятичное число в пределах от 0 до 65535 (обратите внимание, что запятые не должны стоять в числовых аргументах.)

- Восьмеричное число от 0 до 0177777. Число интерпретируется, как восьмеричное, если оно начинается с "0". Например, число 10-это десятичное число, а 010-восьмеричное число, эквивалентное 8 в десятичной системе.

- Шестнадцатеричное число в пределах от 0 до 0хFFFF. Число интерпретируется, как шестнадцатиричное, если оно начинается с "0x" или "0X". Например, 0x10-это шестнадцатиричное число, эквивалентное 16 в десятичной системе.

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

9.5.1. Просмотр списка опций (/HE).

-Опция

    /HE[LP]

Опция /HE используется для высвечивания списка всех возможных опций компановщика.

9.5.2. Останов (пауза) в процессе компановки (/PAU).

-Опция

    /PAU[SE]

Опция /PAU вынуждает компановщик остановить работу перед созданием на диске выполняемого файла (.EXE) и высветить сообщение. Это позволяет вам установить новую дискету, чтобы записать выполняемый файл. Если вы зададите опцию /PAU, программа LINK перед созданием выходного файла высветит следующее сообщение:

    About to generate .EXE file
    Change diskette in drive "letter" and press <ENTER>
    ("Предстоит генерация файла .EXE
Смените дискету в дисководе letter и нажмите ".) Letter-это спецификация текущего дисковода. Программа LINK продолжит выполнение, после того, как вы нажмете клавишу ENTER.


Примечание:

Не удаляйте диск, содержащий заново созданный файл карты распределения памяти, либо диск, используемый для временного файла. Если временный файл создается на диске, который вы планируете сменить, нажмите CTRL+C, чтобы закончить сеанс компановки. Реорганизуйте свои файлы таким образом, чтобы временный файл и выполняемый файл могли быть записаны на один и тот же диск. Затем возобновите процесс компановки.


9.5.3. Высвечивание информации, освещающей процесс компановки (/I).

-Опция

    /I[NFORMATION]

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

-Пример:

    **** PASS ONE ****
    NTOI.OBJ(htoi.c)
    **** LIBRARY SEARCH ****
    c:\lib\MLIBCE.LIB(chkstk)
    c:\lib\MLIBCE.LIB(crto)
    c:\lib\MLIBCE.LIB(printf)

    c:\libMLIBCE.LIB(scanf)
    .
    .
    .
    **** ASSIGN ADDRESSES ****
    **** PASS TWO ****
    HTOI.OBJ(htoi.c)
    c:\lib\MLIBCE.LIB(chkstk)
    c:\lib\MLIBCE.LIB(crto)
    c:\lib\MLIBCE.LIB(printf)
    c:\lib\MLIBCE.LIB(scanf)
    .
    .
    .
    **** WRITING EXECUTABLE ****
    Segments 25
    Groups 1
    Bytes in symbol table 16400
Приведенный выше пример показывает сеанс работы компановщика при заданной опции /I.

9.5.4. Запрет на запросы компановщика (/B).

-Опция:

    /B[ATCH]

Опция /B запрещает компановщику запрашивать у пользователя новый маршрут, если он не может найти требуемую библиотеку, либо требуемые объектные файлы.

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

Использование опции /B может привести к неразрешенным внешним ссылкам. Данную опцию следует использовать, в основном, тем, кто использует пакетную обработку, либо утилиту MAKE, связывает много файлов в одной команде, и не хочет прерывать процесс компановки из-за одного ненайденного файла.

Данная опция, однако, не запрещает компановщику запрашивать аргументы, не заданные в командной строке LINK.

9.5.5. Создание библиотек Quick (/Q).

-Опция:

    /Q[UICKLIB]

Опция /Q сообщает компилятору, что следует объединить заданные объектные файлы и библиотеки в библиотеку Quick. Библиотеки Quick имеют расширение .QLB, а не .EXE, для того, чтобы отличить их от выполняемых файлов. Когда вы стартуете Quick-C, в командной строке QC вы можете задать опцию /l и загрузить таким образом библиотеку Quick. При создании библиотеки Quick имя файла QUICKLIB.OBJ должно быть первым в списке имен объектных файлов для компановки. Подробную информацию о создании и загрузке библиотек Quick вы найдете в Главе 10 "Создание библиотек Quick и автономных библиотек".

9.5.6. Упаковка выполняемых файлов (/E).

-Опция:

    /E[XEPACK]

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

Выполняемые файлы, скомпакнованные с данной опцией могут быть меньше и загружаться быстрее, чем файлы, полученные без данной опции. Однако, вы не сможете отлаживать упакованные программы с помощью отладчика, встроенного в программую среду Quick-C, либо с помощью многооконного отладчика Microsoft Code View.

9.5.7. Игнорирование стандартных библиотек (/NOD).

-Опция:

    /NOD[EFAULTLIBRARYSEARCH]

Опция /NOD требует, чтобы компановщик не искал для разрешения внешних ссылок ни одной библиотеки, заданной в объектном файле. Обычно, программа Quick-C не могут работать корректно без автономных библиотек, построенных с помощью программы SETUP. Таким образом, при использовании опции /NOD, вам следует явно задать имя требуемой автономной библиотеки.

9.5.8. Установка максимального числа сегментов (/SE).

-Опция:

    /SE[GMENTS]:number

Опция /SE управляет числом сегментов, которые компановщик позволяет иметь программе. Стандартное число сементов 128, но вы можете задать свое число number (десятичное, восьмеричное, шестнадцатеричное) в пределах от 1 до 3,72. Для каждого сегмента компановщик должен выделить место для хранения сегментной информации. Если вы зададите число сегментов, большее 128, компановщик, соответсвенно, отведет для сегментной информации больше места. Для программ с количеством сегментов меньшим, чем 128, вы можете уменьшить количество памяти, требуемое компановшику, задав число number, равное действительному количеству сегментов в программе. Компановщик высветит сообщение об ошибке, если данное число слишком велико для памяти, предоставленной компановщику.

9.5.9. Установка максимального количества отводимой памяти (/CP).

-Опция:

    /CP[ARMAXALLOC]:number

Опция /CP установливает максимальное число 16-байтовых параграфов, требуемых для программы при загрузке в оперативную память, равным number-целое число в пределах от 1-65535. Операционная система использует данное значение для распределения памяти при загрузке программы. Стартовый модуль Microsoft-C усекает память соответственно большему из следующих двух значений:

- 64К

- Количествопамяти, заданное с помощью опции /CP.

Для программ с ограниченным количеством данных типа static и динамическим распределением памяти, данная опция не является необходимой.

9.5.10. Создание файла карты распределения памяти (/M, /LI).

-Опция:

    /M[AP][:number]
    /LI[NENUMBERS]
Опции /M и /LI создают файл карты распределения памяти. Файл распределения памяти содержит список сегментов программы в порядке их появления в загруженном модуле. Пример такого файла приведен ниже:
Start   Stop   Length Name               Class
00000H  01E9FH 01EAOH  TEXT              CODE
01EAOH  01EAOH 00000H C ETEXT            ENDCODE

.
.
.
Информация в колонках Start и Stop-это 20-разрядный адрес (в шестнадцатеричной системе) каждого сегмента относительно начала загрузочного модуля. Загрузочный модуль начинается с адреса 0. Колонка Length-это длина сегмента в байтах. Колонка Name-это имя сегмента, колонка Class-это информация о типе сегмента. О группах, сегментах, классах читайте документацию для программистов DOS.

После списка сегментов появляется информация о группах: стартовый адрес и имя каждой группы. Пример списка группы приведен ниже:

Origin       Group
01EA:0       DGROUP
В приведенном выше примере DGROUP-это имя группы данных. DGROUP-это единственная группа, используемая программами, скомпилированными с помощью компилятора MicrosoftQuick-C.

Если вы производите компановку с помощью опции /LI, файл карты распределения памяти содержит также номера строк вашей исходной программы и адреса, соответствующие каждому номеру строки, как показано в приведенном ниже примере:

Line number for HTOI.OBJ(htoi.c) segment  TEXT
     2 0000:0020    4 0000:0019    5 0000:0023    6 0000:0031
     7 0000:0047   10 0000:004B   12 0000:0054   13 0000:005A
    14 0000:005F   16 0000:0067   17 0000:0070   18 0000:0078
    19 0000:007D   20 0000:008A   21 0000:008D   22 0000:008F
    23 0000:0095   25 0000:009A   26 0000:009D   28 0000:00A5
    29 0000:00C2   30 0000:00C5   32 0000:00CA   33 0000:00D2
    36 0000:00D6   38 0000:00DF   40 0000:00E9   42 0000:0107
    43 0000:010F
Если вы выполняете компановку с помощью опции /M, файл распределения памяти содержит два списка глобальных символических имен: первый отсортированный по именам (по возрастанию символов ASCII) и второй по возрастанию адресов. Примечание Abs появляется рядом с абсолютными символическими именами. (Имена, содержащие 16-разрядные константы, значения которых не связаны с программными адресами.)

Каждый список может содержить максимально 2048 отсортированных символических имен. В опции /M можно задать число number, если вы хотите выдать список из большего числа символических имен, отсортированных по адресам. Аргумент number может быть любым десятичным, восьмеричным, либо шестнадцатеричным числом от 0 до 65535 (десятичное), включительно; однако, на практике число отсортированных символических имен ограничено количеством ближней динамической области памяти.

Если вы зададите аргумент number, в файле распределения памяти будет отсутствовать список "Publics by Name" (Внешних имен).

Address           Publics by Name
01EA:0096         STKHQQ
0000:1D86         _brikctl
01EA:04B0         _edata
01EA:0910         _end
.
.
.
01EA:00EC         __abrkp
01EA:009C         __abrktb
01EA:00EC         __abrktbe
0000:9876  Abs    __acrtmsq
0000:9876  Abs    __acrtused
.
.
.


01EA:0240           ___argc
01EA:0242           ___argv

Address           Publics by Value
0000:0010         _main
0000:0047         _htoi
0000:00DA         _exp16
0000:0113         __jhkstk
0000:0129         __astart
0000:01C5         __cintDIV
.
.
.
Большинство глобальных символических имен, появляющихся в файле карты распределения памяти, являются символическими именами, внутренними для компилятора Microsoft Quick-C. Данные символические имена обычно начинаются с одного или более лидирующих подчеркиваний и заканчиваются на QQ.

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

Обе опции /LI и /M включают в файл распределения памяти точку входа в программу, как показано в следующем примере:

Program entry point at 0000:0129

Файл распределения памяти можно также создать, задав опцию /Fm в командной строке QCL, заданием имени такого файла в командной строке LINK, либо заданием имени данного файла в ответе на запрос List File. Однако эти методы не позволят вам увеличить количество символических имен, отсортированных по адресам.

9.5.11. Управление размером стэка (/ST).

-Опция:

    /ST[ACK]:number

Опция /ST определяет размер стека для вашей программы, где number-это любое положительное десятичное, восьмеричное, либо шестнадцатеричное значение до 65535 (десятичное), являющееся размером стека в байтах. Восьмеричные или шестнадцатеричные значение следует задавать в формате, принятом в языке СИ: восьмеричные числа начинаются с нуля, а шестнадцатеричные числа начинаются с "0x".

Если вы не зададите данную опцию, стартовая программа из автономной СИ-библиотеки устанавливает стандартный размер стека 2К.

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

Данная опция имеет то же самое действие, что и опция /F в команде QCL.

-Пример:

    LINK FACT.OBJ EXP.OBJ,,, /STACK:0xC00
Данный пример устанавливает размер стека C00 (то есть 3К) для программы, созданной компановкой объектных модулей FACT.OBJ и EXP.OBJ.

9.5.12. Трансляция "длинных" вызовов (/F, /NOF).

-Опции:

    /F[ARCALLTRANSLATION]
    /NOF[ARCALLTRANSLATION]
Опция /F компановщика просит компановщик оптимизировать "длинные" вызовы процедур, лежащих в том же самом сегменте, что и вызывающая. Данная опция производит значительно более быстрые и компактные программы.

Когда вы зададите опцию компановщика /F, компановщик оптимизирует 32-битовые вызовы процедур, лежащих в том же самом сегменте, что и вызывающая процедура. Поскольку адреса сегмента, как и для вызванных, так и вызывающих процедур те же самые, требуется только 16-битовый вызов. Если задана опция /F, компановщик удаляет "длинные" вызовы и заменяет их на код, который сначала помещает в стек содержимое регистра CS, а зтем делает "короткий" вызов. Вызванная процедура все же возвращается с "длинной" (32-битовой) инструкцией возврата. Однако, поскольку и сегмент кода (хранящийся в CS) и "короткий" адрес находятся в стеке, "длинной" возврат выполняется корректно.Компановщик также добавляет инструкцию последовательно, пяти байтовый "длинный" вызов заменяется пятью байтами инструкций. Хотя компановщик не использует преобразования "длинных" вызовов, если вы его явно не попросите об этом, вы можете применить опцию /NOF для выключения трансляции "длинных" вызовов, если вы, например, задали опцию компановщика /F в переменной программной среды CL.

9.5.13. Упаковка последовательных сегментов (/PAC, /NOP).

-Опции:

    /PAC[KCODE][:number]
    /NOP[ACKCODE]
Опция /PAC просит компановщик сгруппировать соседние сегменты кода. Сегменты кода в одной и той же группе разделяют один и тот же самой адрес сегмента; все адреса смещений, если требуется, регулируются по верхнему. В результате, многие инструкции, которые могли бы в противном случае иметь различные сегментные адреса, будут иметь один и тот же сегментный адрес.

Используемая совместно с опцией компановщика /F (описанной в Разделе 9.5.12), опция /PAC может сократить размер и улучшить эффективность программ средней модели памяти.

Если задано, число number-это предельный размер групп, формируемых с помощью /PAC. Компановщик перестает добавлять сегменты к определенной группе, как только добавление следующего сегмента превысит предельный размер группы. В данном случае компановщик из оставщихся сегментов формирует новую группу. Если число number не задано, стандартное число 65530.

Хотя компановщик не упаковывает соседние сегменты, если вы не попросите его об этом явно, вы можете применить опцию /NOP для выключения упаковки сегментов, если вы, например, задали опцию /PAC в переменной среды CL.

9.5.14. Остальные опции программы LINK.

Не все опции команды LINK подходят для использования программами Quick-C. Перечисленные ниже опции компановщика могут быть использованы для программ Microsoft Quick-C, но они, обычно, никогда не требуются, поскольку, требуемые действия команда QCL, либо компилятор Microsoft Quick-C выполняет автоматически:

    /CO[DEVIEW]

Подготавливает выполняемый файл к отладке в среде Quick-C, либо к использованию многооконным отладчиком и компановке отдельными шагами, данная опция имеет влияние, только если вы компануете объектные файлы, скомпилированные с опцией /Zi.

    /LI[NENUMBERS]

Создает файл распределения памяти, включая номера строк и соответствующие им адреса исходной программы. Если вы осуществляете компиляцию и компановку отдельными этапами, данная опция будет иметь эффект, только если вы компануете объектные файлы, скомпилированные с опцией /Zd.

    /NOI[GNORECASE]

Просит компилятор делать различие между буквами верхнего и нижнего регистра; например, компановщик будет считать ABC, abc и Abc тремя различными именами. Если вы хотите осуществлять компановку без опции /NOI, вам следует выполнить компановку отдельным шагом-с помощью команды LINK.

    /DO[SSEG]

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

Следующие опции не нужно применять при компановке объектных файлов, скомпилированных с помощью компилятора Microsoft Quick-C. Они подходят только для объектных файлов, скомпилированных посредством Макроассемблера Microsoft (MASM).

    /DS[ALLOCATE]

Загружает все данные, начиная со старших адресов стандартного сегмента данных.

    /HI[GH]

Помещает выполняемый файл в память по возможно более старшим адресам.

    /NOG[ROUPASSOCIATION]

Просит компановщик игнорировать групповые связи при назначении адресов элементам кода и данных.

    /O[VERLAYINTERRUPT]:number

Определяет номер прерывания больший, чем 0x3F, для передачи управления "оверлеям".

9.6. Управление размещением стека и динамической области памяти.

Программы, скомпилированные и скомпанованные под управлением Microsoft-C, работают с фиксированным размером стека (стандартный размер 2048 байтов).

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

Подвязывание объектных файлов типа mVARSTCK.OBJ дает вам такую модель: если динамическая область выходит за пределы памяти, она пытается использовать для себя свободную стековую память до тех пор, пока на дойдет до вершины стека. Как только занятая в стеке память освобождается, она снова становится доступной для стека. Заметьте, что размер стека не может вырасти сверх последнего размещенного элемента динамической области в стеке, либо если в стеке нет элементов динамической области, сверх размера, заданного в процессе компановки. Кроме того, обратите внимание, что хотя динамическая область может занимать память, отведенную под стек, обратное невозможмно-стек не может занимать память, выделенную под динамическую область. С помощью связывания вашей программы с одним из объектных файлов типа mVARSTCK.OBJ (где m-первая буква используемой вами библиотеки), вы можете изменить модель, используемую для размещения динамической области. Данные файлы являются версиями процедур для малой, средней, компактной, большой модели памяти, которые позволяют функциям распределения памяти (malloc, calloc, _expand, _fmalloc, _nmalloc, realloc) размещать элементы данных динамической области в неисопользованной области стекового пространства, если они выходят за пределы памяти.

Когда вы связываете вашу программу с одним из файлов mVARSTCK.OBJ, не подавляйте контроль за переполнением стэка с помощью директивы pragma check_stack, либо с помощью опций /Gs или /Ox. В программах с данной опцией переполнение стека может произойти вероятнее, вызвав ошибки, которые затем будет трудно обнаружить.

-Пример:

QCL TEST.C SVARSTCK

Данная командная строка компилирует файл TEST.C, а затем связывает результирующий объектный модуль с файлом SVARTSCK.OBJ-объектным файлом переменного размера стэка для малой модели памяти.

9.7. Использование оверлейных структур.

Если вы не уверены, что программа уместится в имеющуюся память, вы можете указать программе LINK, что следует создать оверлейную версию вашей программы. В оверлейной версии программы, отдельные ее части (известные под названием "оверлей") загружаются только в том случае, когда они требуются. Данные части разделяют между собой одну и ту же область памяти. Оверлейным может быть только программный код, данные никогда не бывают оверлейными. Программы, использующие оверлейнче структуры, обычно требуют меньше памяти, но они работают медленнее, поскольку требуется дополнительное время для считывания программного кода с диска в память.

Оверлейные части определяются посредством заключения их в скобки при задании списка объектных файлов для компановщика. Каждый модуль или комбинация модулей в скобках обозначают один "оверлей". Например, в командной строке LINK вы модете в поле objfiles задать следующий список объектных файлов:

a + (b+c) + (e+f) + g + (i)

В данном примере модули (w+c), (e+f) и (i) являются "оверлеями". Как только управление передается на данные модули, они считываются с диска в память. Модули a и g, а также любые модули из библиотек составляют "резидентную часть" (или "корень") вашей программы. "Оверлеи" загружаются в один и тот же раздел памяти, так, что в отдельный момент времени резидентным является только один, модуль.Дублирующиеся имена в различных "оверлеях" не поддерживаются, поэтому каждый модуль может появиться в программе только однажды. Компановщик передает вызовы из корня в оверлей и вызовы из одного оверлея в другой оверлей с помощью прерывания (за которым следует идентификатор модуля и смещение). По умолчанию номер прерывания 63(3F в шестнадцатеричной системе). Для изменения номера прерывания вы можете воспользоваться опцией компановщика /O.

Опция /O должна применяться только в программах, использующих оверлейные структуры, и порождающих другие программы, использующие оверлейные структуры. В данном случае каждая программа должна использовать отдельный номер оверлейного прерывания, означающий, что хотя бы одна программа должна быть скомпанована с данной опцией.

9.7.1. Ограничения на оверлеи.

Вы можете сделать оверлейными только те модули, управления на которые передается и возвращается с помощью стандартного 32-битового вызова или возврата. Однако, вызовы функций, определяемые ключевым словом near, являются 16-битовыми. Это означает, что вы не можете сделать оверлейными модули, содержащие "ближние" функции, если остальные модули вызывают данные процедуры.

9.7.2. Запросы диспетчера оверлейных структур.

Диспетчер оверлейных структур-это часть стандартных библиотек, поставляемых с компилятором Microsoft Quick-C. Если во время процесса компановки вы объявите "оверлеи", код диспетчера автоматически будет связан с остальными модулями вышей программы

Во время работы выполняемого файла оверлейный диспетчер ищет файл, который требует загрузить другой оверлей. Он ищет данный файл сначала в текущем рабочем каталоге, затем, если файл не найден, диспетчер просматривает каталоги, заданные в переменной операционной среды PATH. Как только диспетчер найдет файл, он извлечет оверлейные модули, заданные корневой программой. Если оверлейный диспетчер не может найти требуемый оверлейный файл, он запрашивает пользователя ввести имя файла. Даже при использовании оверлейных структур, компановщик производит только один файл .EXE. Даннай файл открывается снова и снова, до тех пор, пока диспетчер не потребует извлечь новые оверлейные модули. Например, предположим, что выполняемая программа вызывающая файл PAYROLL.EXE, который не существует ни в текущем каталоге, ни в каталогах, заданных переменной PATH, использует оверлеи. Если пользователь запускает ее с помощью полной спецификации маршрута, оверлейный диспетчер высвечивает следующее сообщение при попытке загрузить оверлейные файлы:

    Cannot find PAYROLL.EXE
    Please enter new program spec:
    (Невозможно найти файл PAYROLL.EXE
    Пожалуйста введите новую программную спецификацию:)
Пользователь может затем ввести спецификацию дисковода или каталог (либо и то и другое), определяющие местоположение программы PAYROLL.EXE. Например, если файл расположен на дисководе В в каталоге \EMPLOYEE\DATA, пользователь должен ввести либо B:\EMPLOYEE\DATA, либо просто \EMPLOYEE\DATA, если дисковод В является текущим.

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

Please insert discette containing B:'EMPLOYEE\DATA\PAYROLL.EXE in drive B: and strike any key when ready

(Пожалуйста вставьте дискету, содержащую файл

B:\EMPLOYEE\DATA\PAYROLL.EXE в дисковод В: и при готовности нажмите любой ключ)

После того, как оверлейный файл будет прочитан с диска, оверлейный дистетчер высветит следующее сообщение:

    Please restore the original diskette.
    Strike any key when ready

(Пожалуйста установите первоначальную дискету. При готовности нажмите любой ключ).

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог