Direcția #define

#define <идентификатор> <текст>

#define <идентификатор> <список параметров> <текст>

Direcția #define înlocuiește toate aparițiile <идентификатора> în fișierul sursă de pe <текст>, urmând în directivă pentru <идентификатором>. Acest proces se numește macrosubstituție, <идентификатор> se înlocuiește numai dacă este un jeton separat. De exemplu, dacă <идентификатор> face parte dintr-un șir sau un identificator mai lung, nu este înlocuit. Dacă pentru <идентификатором> ar trebui să fie <список параметров>, directiva definește o macrocomandă cu argumente.







<Текст> Un set de lexeme, cum ar fi cuvinte cheie, constante, identificatori sau expresii. Unul sau mai multe caractere albe trebuie să fie separate <текст> de la <идентификатора> (sau din parametrii incluși în paranteze). Dacă textul nu se potrivește liniei, atunci poate fi continuat pe linia următoare; Pentru a face acest lucru, tastați un caracter din spate pentru sfârșitul liniei și apăsați imediat ENTER.

<Текст> pot fi omise. În acest caz, toate instanțele <идентификатора> vor fi eliminate din codul sursă al programului. Cu toate acestea, el însuși <идентификатор> este considerată definitivă și, atunci când este verificată, directiva #if dă o valoare de 1 (vezi secțiunea 7.4.1).

<Список параметров>, dacă este specificat, conține unul sau mai mulți identificatori separați prin virgule. Identificatorii din listă trebuie să fie diferiți unul de celălalt. Domeniul de aplicare al acestora este limitat la definiția macro în care sunt definite. Lista trebuie să fie închisă în paranteze. Numele parametrilor formali din <тексте> notează pozițiile în care trebuie înlocuite argumentele efective ale apelului macro. Fiecare nume de parametru formal poate apărea în <тексте> un număr arbitrar de ori.

În apelul macro, după <идентификатором> Lista argumentelor reale care corespund parametrilor formali din <списка параметров>. <Текст> este modificată prin înlocuirea fiecărui parametru formal cu argumentul real corespunzător. Listele argumentelor și parametrilor formali trebuie să conțină același număr de elemente.

Notă. Nu confunda substituirea argumentelor în macrocomenzi cu transferul de argumente către funcție. Înlocuirea în preprocesor este pur textuală. Nu se efectuează niciun fel de calcule sau conversii de tip în acest caz.

Am spus deja că macrocomenzile pot conține mai mult de o apariție a unui anumit parametru formal. Dacă parametrul formal este reprezentat de o expresie cu efect secundar, această expresie va fi evaluată de mai multe ori și cu ea va apărea un efect secundar de fiecare dată. Rezultatul executării în acest caz poate fi eronat.







interior <текста> în direcția #define, numele altor macrocomenzi sau constante pot fi imbricate. Extinderea lor se face numai cu expansiunea <идентификатора> din asta <текста>, și nu la definiția sa prin directiva #define. Acest lucru ar trebui luat în considerare, în special, în interacțiunea dintre constantele numite imbricate și definițiile macro cu directiva #undef. Până când textul care conține textul este extins, acesta poate fi deja anulat de directiva #undef.

nu va cauza preprocesorul în buclă.

#define WIDTH 80

#define LUNGIME (LĂȚIMI + 10)

#define FILEMESSAGE "Încercați să creați un fișier

a eșuat din cauza lipsei de spațiu pe disc "

#define registrul REG1

#definirea registrului REG2

#defineți MAX (x, y) ((x)> (y)). (X). (Y)

# definește MULT (a, b) ((a) * (b))

În primul exemplu, identificatorul WIDTH este definit ca o constantă intregă cu o valoare de 80, iar identificatorul LENGTH ca text (WIDTH + 10). Fiecare apariție a identificatorului LENGTH în fișierul sursă va fi înlocuită cu textul (WIDTH + 10), care după extensia WIDTH identificator devine o expresie (80 + 10). Parentheses în jurul textului (WIDTH + 10), permit evitarea erorilor în operatori, cum ar fi următoarele:

După procesarea preprocesorului, operatorul va arăta astfel:

Valoarea atribuită lui var este 1800. În absența unor paranteze în definiția macro, operatorul ar arăta astfel:

Valoarea var ar fi 280, deoarece operația de multiplicare are o prioritate mai mare decât operația de adăugare.

Cel de-al doilea exemplu definește identificatorul FILEMESSAGE. Definiția sa continuă pe a doua linie utilizând caracterul invers înainte de apăsarea tastei ENTER.

În al treilea exemplu, sunt definite trei identificatori, REG1, REG2, REG3. Identificatorii REG1 și REG2 sunt definiți ca registru de cuvinte cheie. Definiția REG3 este omisă și, prin urmare, orice apariție a REG3 va fi eliminată din fișierul sursă. Secțiunea 7.4.1 prezintă un exemplu care arată modul în care aceste directive pot fi utilizate pentru a specifica clasa de memorie a registrelor pentru cele mai importante variabile ale programului.

În cel de-al patrulea exemplu, sunt definite macro-uri MAX. Fiecare apariție a identificatorului MAX în fișierul sursă este înlocuită de expresia ((x)> (y))? (X): (y), în care, în locul parametrilor formali x și y, sunt înlocuiți cei reali. De exemplu, un apel macro

vor fi înlocuite cu expresie

vor fi înlocuite cu expresie

Rețineți că în această definiție a macrocomenzilor, argumentele cu efecte secundare pot duce la rezultate incorecte. De exemplu, un apel macro

vor fi înlocuite cu expresie

Operanzii unei operații> pot fi evaluați în orice ordine, iar valoarea variabilei i depinde de ordinea calculului. Prin urmare, rezultatul expresiei este imprevizibil. În plus, este posibil ca variabila i să fie incrementată de două ori, ceea ce probabil că nu este necesară.

Exemplul 5 definește macroul MULT. Macro-ul MULT (3,5) din textul programului este înlocuit cu (3) * (5). Parentheses, în care argumentele actuale sunt închise, sunt necesare în acele cazuri în care argumentele macrocomenzilor sunt expresii complexe. De exemplu, un apel macro

va fi înlocuit cu (3 + 4) * (5 + 6), care este egal cu 76. În absența unor paranteze, rezultatul înlocuirii cu 3 + 4 * 5 + 6 ar fi egal cu 29.

Distribuiți această pagină







Trimiteți-le prietenilor: