Программирование на C и C++

Онлайн справочник программиста на C и C++

#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 установки

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