Директивы процессора в С++

Автор: Пользователь скрыл имя, 02 Декабря 2011 в 09:03, реферат

Описание работы

Хотя Turbo C++ использует использует интегрированный однопроходный компилятор как при работе в интегрированной среде разработки (IDE), так и при вызове компилятора из командной строки, полезно тем не менее сохранить терминологию, сохранившуюся от более ранних, многопроходных компиляторов. В случае последних на первом проходе обработки исходного текста программы выполняется подключение всех имеющихсявключаемых файлов, проверка всех условных директив компиляции, расширение всех имеющихся макросов и получение промежуточного файла для обработки последующими проходами компилятора. Посколькукак интегрированная среда разработки, так и версия командной строки Turbo C++ выполняют первый проход, не создаваяпри этом каких-либо промежуточных файлов, Turbo C++ включаетв себя независимый препроцессор, CPP.EXE, который имеет на выходе такой промежуточный файл. CPP полезен на стадии отладки, посколькупоказывает в чистом виде результаты работы директив включения, условных директив компиляции и сложных макрорасширений.

Работа содержит 1 файл

Директивы препроцессора Turbo C.docx

— 48.44 Кб (Скачать)

   Отметим, что имя функции, используемой в #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

   Данная  директива позволяет переопределять конкретные опции командной строки -wxxx (или управлять опцией Display Warnings в диалоговом поле Options \! Compiler \! Messages).

   Например, если в вашем исходном коде имеются  директивы

   #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, если компиляция выполняется при  установленном флаге совместимости  с ANSI (-Aили менюANSI Keywords Only...On); в противном случае макрос неопределен.

   __TIME__

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

   Как и в случае макроса __DATE__, каждое включение __TIME__ будет содержать одно и то же значение, независимо от того, сколько  времени продолжалась обработка  файла. Он имеет формат hh:vv:ss, где hh это часы (от 00 до 23), mm это минуты (от 00 до 59), а ss это секунды (от 00 до 59).

   __TURBOC__

   Данный  макрос специфичендля С++.  Он дает номер текущей версии TurboC++ ввиде шестнадцатиричной константы. Например, версия 1.0 будет представлена в виде 0x0100.

Информация о работе Директивы процессора в С++