#define директивасы көп қолданылатын тұрақтыларды,қызметші сөздерді, операторларды немесе өрнектерді кейбір идентификаторлармен алмастыру үшін қолданылады. Текстілік және сандық алмастыратын – аталған тұрақтылар деп, ал программа бөлігін алмастыратын идентификаторлар - макроанықтамалар деп аталады, және олар аргументтерді қамтуы мүмкін. #define директивасы екі синтаксистік түрде болады:
#define идентификатор текст
#define идентификатор (параметрлер тізімі) текст
Бұл директива идентификатордың барлық келесі кездесулерін текстіге алмастырады. Мұндай процесс макроқойылым деп аталады. Текст Си тіліндегі программаның кез келген бөлігі түрінде болуы мүмкін, немесе тіпті болмауы да мүмкін. Соңғы жағдайда идентификатордың барлық экземплярлары программадан жойылады.
Мысал:
#define WIDTH 80
#define LENGTH (WIDTH+10)
Бұл директивалар программа текстісіндегі әрбір WIDTH сөзін 80 санына, ал әрбір LENGTH сөзін (80+10) өрнегіне (жақшалармен қоса) алмастырады.
Макроанықтамалардағы жақшалар амалдарды орындау кезіндегі қателіктерді болдырмауға мүмкіндік береді. Мысалы, егер жақша салынбаса, t=LENGTH*7 өрнегі t=(80+10)*7 өрнегіне емес, t=80+10*7 өрнегіне түрленеді, және нәтижесінде 630 емес, 780 саны алынады.
#define директивасының екінші синтаксистік түрінде үтірмен ажыратылған бір немесе бірнеше параметрлерді қамтитын тізім қолданылады. Макроанықтамалар текстісіндегі формальды параметрлер макрошақырудың нақты аргументтері қойылатын орындарды белгілейді. Әрбір формальды параметр макроанықтамалар текстісінде бірнеше рет кездесуі мүмкін.
Макрошақыру кезінде идентификатордан кейін саны формальды параметрлермен бірдей нақты аргументтер тізімі жазылады.
Мысал:
#define MAX(x,y) ((x)>(y))?(x):(y)
Бұл директива
t=MAX(i,s[i]) фрагментін
t=((i)>(s[i])?(i):(s[i]) фрагментіне ауыстырады.
Алдыңғы мысалдағыдай, егер нақты аргументтер өрнек болған жағдайда, макроанықтамалар текстісіндегі формальды параметрлер алынған жақшалар амалдарды орындауда кездесетін қателерді болдырмауға мүмкіндік береді.
Мысалы,
t=MAX(i&j,s[i]||j); фрагменті
t=((i&j)>(s[i]||j)?(i&j):(s[i]||j); фрагментіне
ал егер жақша болмаса,
t=(i&j>s[i]||j)?i&j:s[i]||j; фрагментіне алмастырылады,
ал мұнда шартты өрнек мүлдем басқа ретпен есептеледі.
3. #undef директивасы
#undef директивасы #define директивасының әрекетін болдырмау үшін қолданылады. Бұл директиваның синтаксисі келесідей:
Достарыңызбен бөлісу: |