2. Препроцессор

Содержание

Слайд 2

Препроцессор Программа препроцессора #define SMALL #ifdef SMALL #define N 10 #define

Препроцессор

Программа препроцессора

#define SMALL #ifdef SMALL #define N 10 #define number short int #else #define

N 10000 #define number long int #end if #define reverse(k) N - k number A[N];
void main() { for (int i = 0; i

Программа на C

short int A[10];
void main() { for (int i = 0; i<10; i++) A[i] = 10 - i * 10 - i; }

Слайд 3

Препроцессор Синтаксис: текст директива

Препроцессор

Синтаксис:
текст
директива

Слайд 4

Директивы - определение Синтаксис определение ¶ - перевод строки

Директивы - определение

Синтаксис определение

¶ - перевод строки

Слайд 5

Директивы - вызов Синтаксис вызов аргумент

Директивы - вызов

Синтаксис
вызов аргумент

Слайд 6

Директивы - определение Примеры: #define COOL #define N 25 #define begin

Директивы - определение

Примеры:
#define COOL
#define N 25
#define begin {
#define end }
#define forever

for ( ; ; )
#define printnum(n) fprintf(stderr,”%d”,n)
#define printat() fprintf(stderr, \
”at: %s [%d]\n”,__FILE__,__LINE__)
Слайд 7

Директива - вызов Пример: COOL forever begin printat(); printnum(N); end for

Директива - вызов

Пример:

COOL forever
begin
printat();
printnum(N);
end

for ( ;

; )
{
fprintf(stderr, ”at: %s [%d]\n”, “d:\\temp\\prog.c”,3)
fprintf(stderr,”%d”,25);
}
Слайд 8

Директива - определение Пример: опасный синтаксис ? X : Y) (X,

Директива - определение

Пример: опасный синтаксис
? X
: Y)
(X, Y) (

X > Y (A,B)

#define max (X, Y) ( X > Y
? X
: Y)
max(A,B)

Слайд 9

Директива - определение Пример: опасный синтаксис (A > B ? A

Директива - определение

Пример: опасный синтаксис
(A > B ? A : B)

#define

max(X, Y) ( X > Y \
? X \
: Y)
max(A,B)
Слайд 10

Директива - определение Пример: дублирование кода и вычислений (f(A,B) > sqrt(A*A+B*B)

Директива - определение

Пример: дублирование кода и вычислений

(f(A,B) > sqrt(A*A+B*B) ? f(A,B)

: sqrt(A*A+B*B))

#define max(X, Y) ( X > Y ? X : Y)
max( f(A,B) , sqrt(A*A+B*B) )

Слайд 11

Директива - определение Пример: рекурсия #define fact(n) (n==0 ? 1 :

Директива - определение

Пример: рекурсия
#define fact(n) (n==0 ? 1 : (n)*fact(n-1))
fact(10)
зацикливание (10==0

? 1 : (10)*(10-1==0 ? 1 : (10-1) * (10-1-1==0 ? (10-1-1) * … )))
(Циклов тоже нет. В PL/I – есть.)
Слайд 12

Директива - включение Синтсксис

Директива - включение

Синтсксис

Слайд 13

Директива - включение Примеры: #include “main.h” #include “..\\include\\person.h” #include “../include/person.h” #include “d:\\projects\\dialogs\\form.h” #include #include “stdio.h”

Директива - включение

Примеры:
#include “main.h”
#include “..\\include\\person.h”
#include “../include/person.h”
#include “d:\\projects\\dialogs\\form.h”
#include
#include “stdio.h”

Слайд 14

Директива - условное Синтаксис Альтернатива Услов-опред

Директива - условное

Синтаксис
Альтернатива
Услов-опред

Слайд 15

Директива - условное Пример #define SMALL #ifdef SMALL #define N 10

Директива - условное

Пример #define SMALL #ifdef SMALL #define N 10 #define number short int #else

#define N 10000 #define number long int #end if
Слайд 16

Директива - условное Синтаксис Услов-опред

Директива - условное

Синтаксис
Услов-опред

Слайд 17

Директива - условное Пример #define N 18 #define B(k) ((N &

Директива - условное

Пример
#define N 18 #define B(k) ((N & ~(k-1)) == 0) #if

(B(8)) #define scale unsigned char #elseif (B(16)) #define scale unsigned short #else #define scale unsigned long #end if
Слайд 18

Директивы - условное Пример: #ifdef – устаревшее. Эквивалентно: #ifdef A …

Директивы - условное

Пример: #ifdef – устаревшее.
Эквивалентно:

#ifdef A

#endif

#if (defined(A))

#endif

Допустимы сложные условия с

defined

#if (defined(A) && !defined(B) || N>3)

#endif

Слайд 19

Операции # и ## ## - конкатенация идентификаторов, # - преобразование

Операции # и ##

## - конкатенация идентификаторов, # - преобразование в

строку
Пример:
xy + 5
a 5 + 5
a5 + “5”

#define A(x,y) xy + y
#define B(x,y) x y + y
#define C(x,y) x##y #y
A(a,5)
B(a,5)
C(a,5)

Слайд 20

Типичные использования Повторное включение #include “io.h” … #ifndef IO_DEFINED #define IO_DEFINED

Типичные использования

Повторное включение

#include “io.h”

#ifndef IO_DEFINED
#define IO_DEFINED
#define read() ….
#define write() ….
unsigned char buffer[1024];
#endif

#include

“io.h”

Parse.h

IO.H

Person.h

#include “Parse.h” #include “Person.h”

Main.c

Слайд 21

Типичные использования Определение констант #define N 25 #define N2 25*(25-1) int X[N2-1];

Типичные использования

Определение констант
#define N 25
#define N2 25*(25-1)
int X[N2-1];

Слайд 22

Типичные использования Условная трансляция switch (code) { #ifdef debug case codeA

Типичные использования

Условная трансляция

switch (code)
{
#ifdef debug
case codeA :

break;
#endif
case codeB

:

break;
default :

}