Директива #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 установки
где установки — это опции для определения предупреждений.