Predpokladame jiz znalost celeho Medvedova pruvodce po Cecku. Informace k builtinum na poslednim slajdu snadno najdete v GCC manualu, sekce prevazne "Other builtins" (na webu nebo `pinfo gcc`). Pojdme si jeste na zaver trochu procvicit pouziti preprocesoru. Rychle vysledek preprocesorove faze muzete zkontrolovat pomoci switche gcc -E Nuze: (i) Napiste makro boolof(x), ktere vrati (co nejefektivneji) 1/0 podle toho, je-li hodnota jeho parametr booleovske true nebo false. (I hodnota vetsi nez 1 je true!) (ii) Napiste makro bitat(x, N), ktere vrati N-ty bit x. (iii) Napiste makro DEBUG(x, FMT), ktere napr. pri pouziti ve file.c na radku 1234 jako int x = 1; DEBUG(x, "%d"); vypise na stderr file.c:1234 x=1 (iv) Napiste makro min(a, b), max3(a, b, c). (v-a) Napiste makro lengthof(array), ktere vrati pocet prvku pole. (v-b) Napiste makro offsetof(struct, field), ktere vrati (v bajtech) offset polozky jmenem 'field' ve strukture jmenem 'struct' (jde o jmeno typu, ne promenne!). ---- Hinty a reseni (i) Prvni myslenka: #define boolof(x) ((x) != 0 ? 1 : 0) Druha myslenka: #define boolof(x) ((x) != 0) Treti myslenka: #define boolof(x) (!!(x)) Najdete protipriklad (parametr, pro ktery bude mit boolof() jinou hodnotu), vynechame-li kterekoliv zavorky. (iii) #define DEBUG(x, FMT) \ fprintf(stderr, "%s:%d %s=" FMT "\n", __FILE__, __LINE__, #x, x) (Co kdybychom za fprintf() napsali strednik? Najdete protipriklad.) (iv) Pozor na sideeffecty. Viz Pruvodce. (v-a) #define lengthof(array) (sizeof(array) / sizeof((array)[0])) (v-b) K rozmysleni na doma.