Macrouri predefinite
----- ----- -----------------
In ANSI C sunt 5 macrouri predefinite. Nu pot fi redefinite de catre programator. Ele au la inceput si sfarsit cate doua simboluri
"underscore".
Macro predefinit Valoare
-------- ----- ------ ----- ----- --------- ----- -------
__DATE__ Un sir ce contine data curenta
__FILE__ Un sir ce contine numele fisierului
__LINE__ Un intreg reprezentand numarul liniei curente
__STDC__ Daca implementarea=ANSI C, atunci acesta
reprezinta un numar diferit de zero
__TIME__ Un sir ce contine timpul curent
-------- ----- ------ ----- ----- --------- ----- -------
----- ----- ------------
Operatorii # si ##
----- ----- ------------
Operatorii de preprocesare # si ## sunt valabili in ANSI C, dar nu si in C traditional. Operatorul unar # cauzeaza transformarea in sir a unui parametru formal dintr-o macro-definitie.
#define mesaj_pentru(a, b) \
printf(#a " si " #b ": Te iubim !\n")
void main()
La apelul acestui macrou, fiecare parametru al acestuia este inlocuit cu argumentul corespunzator, iar # cauzeaza ca argumentele sa fie puse intre ghilimele. Altfel spus, dupa preprocesare, in memorie se obtine:
void main()
Deoarece sirurile constante separate prin spatiu se concateneaza, instructiunea de mai sus este echivalenta cu:
void main()
Operatorul binar ## este folosit la impartirea in tokenuri lexicale.
------------
Exemplu:
------------ #define X(i) x ## i
X(1) = X(2) = X(3);
va deveni dupa preprocesare
x1 = x2 = x3;
----- ----- ---------------
Macroul "assert()"
----- ----- --------------
ANSI C pune la dispozitie macroul "assert()" din biblioteca standard "assert.h". Acest macrou poate fi folosit cand vrem sa ne asiguram ca o expresie are o anumita valoare. Vrem sa scriem o functie ale carei argumente satisfaca niste conditii.
-----------
Exemplu:
-----------
#include <assert.h>
void f(char *p, int n)
Daca vreo asertiune esueaza, atunci sistemul va tipari un mesaj si va opri executia programului. Iata o implementare posibila a lui
"assert()".
#if defined(NDEBUG)
#define assert(ignore) ((void) 0) /* ignorare */
#else
#define assert(expr)
if (!(expr)) \
#endif
De remarcat ca daca NDEBUG este definit, atunci sunt ignorate toate asertiunile. Aceasta permite programatorului in timpul scrierii programului sa verifice pas cu pas executia programului. Functia "abort()" se gaseste in biblioteca standard.
|