Автор: Пользователь скрыл имя, 02 Декабря 2011 в 09:03, реферат
Хотя Turbo C++ использует использует интегрированный однопроходный компилятор как при работе в интегрированной среде разработки (IDE), так и при вызове компилятора из командной строки, полезно тем не менее сохранить терминологию, сохранившуюся от более ранних, многопроходных компиляторов. В случае последних на первом проходе обработки исходного текста программы выполняется подключение всех имеющихсявключаемых файлов, проверка всех условных директив компиляции, расширение всех имеющихся макросов и получение промежуточного файла для обработки последующими проходами компилятора. Посколькукак интегрированная среда разработки, так и версия командной строки Turbo C++ выполняют первый проход, не создаваяпри этом каких-либо промежуточных файлов, Turbo C++ включаетв себя независимый препроцессор, CPP.EXE, который имеет на выходе такой промежуточный файл. CPP полезен на стадии отладки, посколькупоказывает в чистом виде результаты работы директив включения, условных директив компиляции и сложных макрорасширений.
Отметим, что имя функции, используемой в #pragma startupили exit, должно быть определено (или объявлено) до того,как встретится соответствующая строка с директивой #pragma.
Директива #pragma inline
Данная директиваэквивалентна опции компилятора командной строки -B или соответствующей опции интегрированной среды Turbo. Она сообщаеткомпилятору, что программа содержит встроенные ассемблерные коды (см. главу 6, "Интерфейс с языком ассемблера"). Синтаксис ее следующий:
#pragma inline
Эту директиву лучше всего помещать вверху файла, поскольку, встретив директиву #pragma inline, компилятор перезапускает себя с опцией -B. Фактически можно опустить и опцию -В, и директиву #pragma inline, и компилятор тем не менее выполнитперезапуск, когда встретит операторы asm. Назначение опции и директивы состоит в том, чтобы сэкономить время компиляции.
Директива #pragma option
Директива #pragma option используетсядля включения опций компилятора командной строки в код вашей программы. Синтаксис этой директивы следующий:
#pragma option [опции...]
Опции могут являться любыми опциями команднойстроки(за исключением перечисленных в следующем параграфе). В одной директиве может находиться любое число опций.
Ниже приводятсяопции,которые не могут находиться в директиве pragma option:
-B (компиляция с использованием ассемблерных кодов)
-c (компиляция без компоновки)
-dxxx (определение макроса)
-Dxxx = ccc (определение макроса с текстом)
-efff (имя .EXE-файла fff)
-lfff (имя включаемой директории)
-Lfff (имя директории с библиотекой)
-lxset (опция компоновщика x)
-M (создание при компоновке .MAP-файла)
-o оверлеи
-Q EMS
-S (создание на выходе .ASM-файла и остановка)
-Uxxx (отмена определения макроса)
-V (virtual)
-Y (оверлеи)
Существует два состояния компилятора. В первом состоянии в директиву pragma option можно включить большее количество опций, нежели во втором. Первое состояние компилятора называется состоянием лексического анализа,а второе - состоянием кодирования.
Использование имени макроса, начинающегося двумя символами подчеркивания (которое может являться именем встроенного макроса), в директивах #if, #ifdef, #ifndef или #elifизменяет состояние компилятора на состояние кодирования.
Появление первой реальной лексемы (первого объявления
С) также изменяет состояние компилятора на кодирование.
Другими словами, можноиспользовать директивы #pragma, # include, #define и некоторые разновидности #if во время состояния лексического анализакомпилятора. Во время этой фазы вы имеете возможность при помощи #pragma option изменять опции командной строки.
В числоопций,которые могут быть заданы в #pragma option только в состоянии лексического анализа компилятора, входят:
-Efff (строка с ассемблерным именем)
-f* (любая опция плавающей точки, кроме -ff)
-l# (значащие символы идентификатора)
-m* (любая опция модели памяти)
-nddd (выходная директория)
-offf (имя выходного файла fff)
-u (использование символов подчеркивания в именах cdecl)
-z* (опция задания любого имени сегмента)
Прочие
опции могут изменяться где угодно.
Следующие опции оказывают
-1 Управление набором команд
-2 Управление набором команд
-a Управление выравниванием. (Отметим, что выравнивание компонентов структурыустанавливается в точке определения структуры, а не далее, при использовании этой структуры объектами.)
-ff Управление быстрыми операциями с плавающей точкой
-G Генерация
кода, оптимизированного по
-k Стандартное управление стековым фреймом
-N Управление контролем стека
-O Управление оптимизацией
-P Установка по умолчанию соглашений о связях Pascal
-r и -rd Управление регистровыми переменными
-v Управление отладкой по действиям
-y Управление строчной информацией
Следующие опциимогут изменяться в любой момент и оказывают немедленное воздействие на компилятор:
-A Управление ключевыми словами
-C Управление вложенностью комментариев
-d Слияние повторяющихся строк
-gn Остановка компиляции после n предупреждений
-jn Остановка компиляции после n ошибок
-K Тип char устанавливается как unsigned
-wxxx Предупреждение (то же самое, что и #pragma warn)
Любые из имеющих два переключающихся состояния опций (такие как -a или -K) могут быть переведены во включенное или выключенное состояние, как это делается в командной строке. Дополнительно имеется возможность задавать их с точкой (.), что устанавливает такие опции в состояние, задаваемое командной строкой.
Директива #pragma saveregs
Директива #pragma saveregs гарантирует, что при входе в функцию hugeзначения всехрегистров останутся без изменений. Данная директива иногда бывает нужна для интерфейса с кодами на языкеассемблера. Директивадолжнанаходиться непосредственно перед определением функции. Ее действие распространяется только на данную функцию.
Директива #pragma warn
Данная
директива позволяет
Например, если в вашем исходном коде имеются директивы
#pragma warn +xxx
#pragma warn -yyy
#pragma warn .zzz
то выдача предупреждения xxx будет разрешена (даже если в меню Options \! Compiler \! Messages она была переведена в состояние off), предупреждения yyy запрещена, а статус выдачи сообщения zzz будет восстановлен в то состояние, которое было к моменту начала компиляции файла.
Полный список трехбуквенных сокращений и сообщений, к которым они относятся, см. в Главе 4, "Компилятор командной строки" в Руководстве пользователя.
Предопределенные макросы
Turbo C++ имеет следующие предопределенные глобальные идентификаторы. За исключением __cplusplus, каждое из них и начинается, и заканчиваетсядвумя символами подчеркивания (__). Эти макросы также называют буквальными константами.
__CDECL__
Данный макрос специфичен для Turbo C++. Он сообщает о том, что флаг -p не использовался (меню Cflling Conventions...C) : он устанавливается равным целочисленной константе 1, если -pне использовался; в противном случае он неопределен.
Следующие
символические имена
__COMPACT__ __MEDIUM__
__HUGE__ __SMALL__
__LARGE__ __TINY__
Для конкретной компиляции определенным является только один из этих макросов; прочие, по определению, не определены. Например, если при компиляциивыбрана модель памяти small, то макрос __SMALL__ определен, а остальные неопределены, поэтому директива
#if defined(__SMALL__)
даст значение "истина", а
#if defined(__HUGE__)
либо любая другая из оставшихся) даст значение "ложь". Фактическое значение любого из этих макросов, когда он определен, равно 1.
__cplusplus
Данный макрос специфичен для Turbo C++. Он позволяет написать модуль, который в некоторых случаях будет компилироваться в С, а в некоторых - в С++.Использование условных директив компиляции позволяет управлять, какие части программы для С и С++ будут включены в компиляцию.
__DATE__
Данный макрос дает дату начала обработки препроцессором данного исходного файла (в виде строкового литерала).
Каждое включение __DATE__ в данный файл дает одно и то же значение, независимо от того, сколько времени продолжается обработка файла препроцессором. Дата имеет форму mmmddyyyy,где mmm это месяц (Jan, Feb и т.д.), dd равно числу месяца (от 1 до 31, причем если это число меньше 10, то первый символ d равен пробелу), а yyyy это год (1990, 1991 и т.д.)
__FILE__
Данныймакрос дает имя текущего обрабатываемого препроцессором исходного файла (в виде строкового лите-
рала). Когда препроцессор обрабатывает директиву #include
или #line, либопри завершении обработки включаемого файла,
данный макрос соответствующим образом меняет свое значение.
__LINE__
Данный макрос дает количество обработанных препроцессором к данному моменту строк текущего исходного файла. Обычно первая строка исходного файла определяется с номером 1, хотя на это может повлиять директива #line. Информацию о директиве #line см. на стр. 144 оригинала.
__MSDOS__
Данный макрос специфичен для Turbo C++. Он дает целочисленную константу 1 для всех случаев компиляции.
__OVERLAY__
Данный макрос специфичен для С++. Он предопределен равным 1, еслимодуль компилируетсяс опцией -Y (включена поддержка оверлейных структур). Если оверлейные структуры не поддерживаются, то данный макрос неопределен.
__PASCAL__
Данный макрос специфичен для С++. Он сообщает о том, чтобыл использован флаг -p. Макрос установлен равным целочисленной константе 1, если флаг -p использовался; в противном случае он неопределен.
__STDC__
Данный
макрос определен равным константе
1, если компиляция выполняется при
установленном флаге
__TIME__
Данный макрос дает время начала обработки препроцессором текущего исходного файла (в виде строкового литерала).
Как и в случае макроса __DATE__, каждое включение __TIME__ будет содержать одно и то же значение, независимо от того, сколько времени продолжалась обработка файла. Он имеет формат hh:vv:ss, где hh это часы (от 00 до 23), mm это минуты (от 00 до 59), а ss это секунды (от 00 до 59).
__TURBOC__
Данный макрос специфичендля С++. Он дает номер текущей версии TurboC++ ввиде шестнадцатиричной константы. Например, версия 1.0 будет представлена в виде 0x0100.