Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
http.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.34 Mб
Скачать

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

Помимо #ifdef существует второй способ узнать, определен ли макрос. В сочетании с директивой #if можно использовать оператор времени компиляции defined. Оператор defined имеет следующий вид: defined имя_макроса

Если имя_макроса определено, то выражение становится истинным. В противном случае оно ста­новится ложным. Например, для того, чтобы узнать, определен ли макрос MYFILE, можно ис­пользовать одну из двух команд препроцессора: #if defined MYFILE или #ifdef MYFILE

Перед defined можно также поместить ! для изменения состояния. Например, следующий фраг­мент компилируется, только если DEBUG не определен. #if ! defined DEBUG printf ("Final version!\n"); #endif

#line

Директива #line используется для изменения содержимого __LINE__  и __FILE__, являющихся пред­определенными макросами. __LINE__ содержит номер компилируемой строки, а __FILE__  имя компилируемого файла. Стандартный вид команды #line следующий: #line число "имя_файла"

где число - это любое положительное число, а необязательный параметр имя_файла является любым допустимым файловым идентификатором. Номер строки заносится в __LINE__, а имя файла — в __FILE__. #line предназначена для отладочных целей и специальных приложений.

Например, следующая директива определяет, что отсчет строк будет начинаться со 100. Оператор printf() выводит число 102, поскольку он стоит в третьей строке программы после оператора #line. #include <stdio.h> #line 100                          /* переустановка счетчика строк*/ int main(void)                   /* строка 100 */ {                                       /* строка 101 */ printf ("%d\n",__LINE__);  /* строка 102 */ return 0; }

#pragma

Директива #pragma определяется стандартом ANSI С для реализации директив, предоставляю­щих компилятору различные инструкции. Стандартный вид #pragma следующий: #pragma имя

где имя — это имя директивы #pragma. Borland определяет 14 директив #pragma: argused anon_struct codeseg comment exit hdrfile hdrstop inline intrinsic message option saveregs startup warn

Директива argused должна стоять перед функцией. Она используется для устранения предупреж­дений, если аргумент функции, перед которой стоит #pragma, не используется в теле функции.

Чтобы разрешить использовать анонимные структуры, укажите директиву anon_struct. С помо­щью директивы codeseg можно указать сегмент, класс или группу, используемую функцией.

Используя директиву comment, в выходной файл, например, в файл с расширением obj или ехе можно поместить комментарии.

Директива exit определяет одну или несколько функций, вызываемых при завершении програм­мы. Директива startup определяет одну или несколько функций, вызываемых при запуске про­граммы. Они имеют следующий вид: #pragma exit имя_функции приоритет #pragma startup имя_функции приоритет

Приоритет — это значение от 64 до 255 (значения от 0 до 63 зарезервированы). Приоритет определяет порядок вызова функций. Если приоритет не указан, то по умолчанию предполагает­ся значение 100. Все функции, выполняющиеся в начале или конце программы, должны объяв­ляться следующим образом: void f(void);

Следующий пример определяет функцию start(), выполняющуюся в начале программы. #include <stdio.h> void start(void); #pragma startup start 65 int main(void) { printf("In main\n"); return 0; } void start (void) { printf("In start\n"); }

В результате работы программы на экране появится: In start In main

Как показывает данный пример, необходимо предоставить прототип функции до использования директивы #pragma.

С помощью директивы hdrfile можно определить имя файла, используемого для хранения пред- компилированных заголовочных файлов. Он имеет вид #pragma hdrfile "имя_файла. csm"

где имя_файла — это имя файла (с расширением csm).

Директива hdrstop сообщает Borland С++ о необходимости остановить предкомпиляцию заго­ловочных файлов.

Также имеется директива inline, имеющая следующий вид: #pragma inline

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

Используя директиву intrinsic, можно указать компилятору на необходимость подстановки кода функции вместо ее вызова. Директива имеет вид: #pragma intrinsic имя_функции

где имя_функции — это имя функции, которую необходимо сделать внутренней.

Если выбрать опцию Inline Intrinsic Function в ИСР (интегрированной среде разработчика) или воспользоваться опцией -Oi при компиляции с помощью строчного компилятора, то Borland ав­томатически сделает внутренними следующие функции: alloca memcpy stpcpy strcpy strncpy fabs memset strcat strlen strnset memchr rotl strchr strncat strrchr memcmp rotr strcmp strncmp

Воспользовавшись директивой intrinsic, можно отменить функции, которые станут внутренними: #pragma intrinsic имя_функции

Директива message позволяет определить сообщение, выводимое в качестве предупреждения при компиляции программы. Например: #include <stdio.h> #pragma message This will be displayed as a warning. int main(void) { int i=10; printf ("This is i: %d\n", i); #pragma message This is also displayed as a warning. return 0; }

При компиляции появятся два сообщения #pragma, выводящиеся в качестве предупреждений. При использовании ИСР они появятся в стандартном окне сообщений.

Директива option позволяет определить опции командной строки вместо того, чтобы данные опции явно указывать в командной строке. Она имеет следующий вид: #pragma option список_опций

Например, следующая директива приводит к тому, что содержащая ее программа будет компи­лироваться в модели large: #pragma option -ml

Следующие опции не могут использоваться с директивой option: -В -с -D -е -Е -F -h -l -М -о -Р -Q -S -Т -U -V -X -Y

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

Директива saveregs запрещает функции, объявленной как huge, изменять какие-либо регистры. Данная директива должна стоять перед функцией, и она влияет только на функцию, перед кото­рой стоит.

Директива warn позволяет запретить или разрешить различные предупреждения. Она имеет вид: #pragma warn установки

где установки — это опции для определения предупреждений.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]