-->
Главная » Статьи » Информатика

ПРЕПРОЦЕССОР ДИРЕКТИВІ

ПРЕПРОЦЕССОР ДИРЕКТИВІ

 

Си тілінің препроцессоры компиляцияны нөлінші фазасында алғашқы файлды өңдеу үшін қолданылатын макропроцессор болып есептелінеді. Препроцессор директиві Си-дегі программаның алғашқы мәтінінің нұсқауы болып табылады және әдетте алғашқы программаның модификациясын жеңілдету үшін және оларды Си тілінің компиляторынан және операциялық ортадан тәуелсіз болу үшін қолданылады. Препроцессор директиві программаның мәтінінде лексемдерді кейбір мәндерімен ауыстыруға мүмкіндік береді, соның ішінде алғашқы файлға басқа алғашқы файлдың мәндерін қояды, алғашқы файлдың кейбір бөліктерін компиляциясына тыйым салады және т.с.с.

Си тілінің мынандай мүмкіндіктері жиірек қолданылады: компилияция кезінде файлды қосатын #include, және бірдей мәтінді шынжырларды басқаға ауыстыратын # define.

# include құралы жеке жағдайда #define  және декларациясы құралдарымен оңай манипулияция жасауға  мүмкіндік береді.

#include "файл аты” немесе

# include <файл аты>

түрдегі кез-келген жол файлдың файл аты атауымен ауыстырылады. Егер файл аты екі тырнақшаға алынса, онда ереже бойынша, файл программасының алғашқы файлдарының арасынан ізделінеді; егер мұндай табылмаса немесе файл аты<және> бұрыштық жақшаға алынса, онда іздеу жүйелік библиотекаларда жүзеге асырылады. Қосылған файлдың өзі  #include жолынан тұрады.

# include құралы –декларациямен үлкен программаларды жинақтаудың жақсы тәсілі. Ол әсіресе, жағымсыз қателерді неге байланыстыруға болмайтынын, барлық алғашқы файлдарды бір және сондай анықтамалармен және айнымалылардың сипаттамаларымен қолдануға болатынына кепілдік береді. Қосылған файлға өзгерісті енгізуде, барлық одан тәуелді файлдар қайтадан құрастырылуы қажет.

Макроауыстырулар анықтамасы келесі түрде болады:

define мәтін орнын босататын ат

Макроауыстырулар қарапайым ауыстырулар үшін қолданады: лексема аты кездесетін барлық орындарда, оның орнынамәтін орнын басатын орналасады. #define-ның атауы кәдімгі айнымалылар атауларының ережесі бойынша беріледі. Орнын басатын мәтін кез-келген болуы мүмкін. #define-дағы атаудың әрекет ету аймағы берілген анықтамадан соңғы файлға дейін өшіріледі.

Макроауыстырулар орын басатын мәтін берілген параметрлерден тәуелді түрленетін  аргументтерімен анықталады. Мысалы, max-ты анықтайық.

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

max-қа қатнасу мәтіндік ауыстыруларды ғана шақырады. Әр формальды параметр сәйкес аргуменпен ауыстырылады.

x=max (p+q,r+s) жолы x=((p+q) > (r+s) ? p+q) : ( r+s)) жолымен ауыстырылады.
Аргументтерге кез-келген ауыстыруларды жасауға болатындықтан, көрсетілген max анықтамасы кез-келген типтің мәліметтері үшін орынды!

Атауларды  #undef көмегімен препроцессордан "жасыруға” болады.

#undef getchar

int getchar ( void) {…}

Ереже бойынша, бұл макроанықтамаларды осы функциялардың сол атымен "қайта басу” керек. #define  диретиві әдетте, #undef директиві жұбында қолданылады.

Макроанықтамалар синтаксис бойынша функцияның анықтамасын еске түсіреді. Функцияны шақыруды макрошақыру мен ауыстыру программаның орындалу жылдамдығын жоғарлатуы мүмкін, және басқа жағынан, макроанықтамаларды қайта-қайта қолданып анағұрлым үлкен жадыны талап етеді.

Шартты компилияция Си тілінде тікелей компилияцияны емес, препроцессорлық өңдеуді басқаратын шартты нұсқаулардың командаларының жиынымен қамтамасыз етеледі.

#if     тұрақтылы өрнек                            // шартты тексеретін

#ifdef    идентификатор

# ifndef           идентификатор

#else

#endif

#elif

Шартты нұсқаулар компилияция кезінде есептелетін, шарттың мәнінен тәуелді, сол немесе басқа программа мәтінін таңдап қосу үшін құрал болып есептеледі.

Бірінші үш командалар шарттың орындалуын тексереді, қалған екеуі – тексерілген шарттың әрекет ету диапазонын анықтауға мүмкіндік береді. Шартты құрылымы төмендегідей:

#if … 1 мәтін

#else   2 мәтін

#endif

#else  мәтін 2  нұсқау міндетті түрде емес. Мәтін 1 құрастырылған мәтінге тексерілген шарттың тек ақиқат болғанда ғана қосылады, кері жағдайда  ( #else-нің барында) компилияцияға мәтін 2  беріледі. Егер #else директиві болмаса, онда  # if –тең #endif-ке дейінгі барлық мәтін шарт жалған болғанда қалдырылып кетеді:

Мысалы, # if 5+4

       мәтін1

#endif

диретивінің орындалу нәтижесінде, мәтін1  әрқашан құрастырылған программаға қосылады.

#ifndef директивінде кері шарт тексеріледі – иденфикатордың анықтамаларындағы ақиқат болып есептеледі, яғни идентификатор #define командасында қолданылса немесе анықтамасы #undef командасымен жойылса ақиқат болады.

Шартты компилияцияны өңдеуде қосу немесе бақылау баспаларын шығару үшін қолданған ыңғайлы. Мысалы,

             #define DE 1

             …

             #ifdef DE

               printf ( "өңделетін баспа”);

             #endif

DE идентификаторының анықталуынан тәуелді программада пайда болатын мұндай баспалар бірнеше болуы мүмкін және #define DE 1 директивін алып тастай отырып бірден барлық өңделетін баспаларды үзіп тастаймыз.

Программаның модулімен препроцессорды қосу үшін арналған файлдар әдетте, қайталанып қосылудан сақтанумен жабдықтайды. Мұндай қайталап қосылу, егер әрқайсысында бірдей және сондай файлдың препроцессоры қосылуы жоспарланған бірнеше модульдер, программаның жалпы мәтініне біріктірілетін болса, жүзеге асады. Мысалы, осындай құрылымдар мен қорғау стандартты библиотеканың барлық аты үшін алынған файл жабдықталады. Қайталап қосылудан қорғау сұлбасы мынадай болуы мүмкін:

// filename атымен берілген файл

#ifndef FILE_NAME

…    // filename файлын қосатын мәтін

#define FILE_NAME 1

#endif

Мұнда  FILE_NAME – программаның басқа мәтіндерінде кездеспеуге тиісті filename файлы үшін кейінге сақтайтын процессорлары идентификатор.

Программаның алғашқы мәтінінің препроцессорымен өңдеу кезінде мультитармақталуды ұйымдастыру үшін  # elif тұрақтылы өрнек директиві енгізілген.

Осы директивті қолдануды алғашқы мәтіннің құрылымы төмендегідей болады:

   #if

            if­_үшн_ мәтін

   #elif    өрнек 1

             мәтін 1

   #elif    өрнек 2

мәтін 2

   #else жағдайы_ үшін_мәтін

   #endif

Препроцессор бастпақыда #if дериктивіндегі шартты тексереді, егер ол жалған болса, (0-ге тең), өрнек 1-ді есептейді, егерөрнек 1 0-ге тең болса - өрнек 2 және т.б. Егер барлық өрнектер жалған болса, онда құрастырылған мәтінге else_жағдайы_ үшін_ мәтін қосылады. Кері жағдайда, яғни ең болмағанда бір ақиқат өрнектің пайда болуында (#if-те немесе #elif-те), осы директивтен кейін тікелей орналасқан мәтіннің өңделуі басталады, ал барлық қалған дерективтер қарастырылмайды.

Категория: Информатика | Добавил: admin_ (17.11.2013)
Просмотров: 1224 | Теги: ПРЕПРОЦЕССОР ДИРЕКТИВІ с++ қазақша | Рейтинг: 0.0/0
Всего комментариев: 0

Имя *:
Email:
Код *: