Информатика -продвинутый курс


ДИРЕКТИВЫ ПРЕПРОЦЕССОРА - часть 2


Например, прочитав определения

 

#defmePI3.14159

#defineE2.711828

 

препроцессор заменит в программе все имена PI и Е на соответствующие числовые константы.

Препроцессор языка Си позволяет переопределять не только константы, но и целые программные конструкции. Например, можно написать определение

 

#define forever for(;;)

и затем всюду писать бесконечные циклы в виде forever

Определение макроимени с параметрами имеет некоторую специфику. Список параметров макроимени - это список идентификаторов, разделенных запятыми. Следующая после списка параметров строка лексем также может содержать эти параметры, которые при макровызове будут заменены на соответствующие аргументы.

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

В следующих программах иллюстрируются некоторые применения операторов препроцессора.

Пример 1: найти большее из двух чисел.

 

Программа 110

#include<stdio.h>

#define MAX(X,Y) ((X)>(Y) ? (X) : (Y))

main()

{

int x,y;

scanf ("%d %d", &x, &y); printf ("%d", MAX(x, y) );

)

Результат работы программы:

3                     5

5

 

Пример 2.

 

Программа 111

 

#include<stdio.h>

#define S (x) x*x

#define P(x) printf("x равен

%d.\n",x)

main()

{

int x=4;

int z ;

z = S(x); P(z); z = 3(2);

P(z);

P(S(x));

P(S(x+2));

P(100/S(2));

P(S(++x)) ;

}

Результат работы программы:

 

x равен 16.

x равен 4.

x равен 16.

x равен 14.

x равен 100.

x равен 30.

 

Оператор препроцессора #pragma позволяет записывать самые различные указания компилятору (зависящие от конкретного компилятора). Например, следующие два предложения препроцессора

 

#pragma recursive

#pragma nonrec

устанавливают режим всех функций программы по умолчанию рекурсивным или нерекурсивным. Указание препроцессора

 

#pragma optimize time

 

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

 




Начало  Назад  Вперед



Книжный магазин