Některá rozšíření šikovná (nejenom) pro psaní maker -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- #define QUESTION(bb) (bb || (!bb)) -- Shakerspeare Celkem častno se stává, že chcete napsat makro, co jde napsat na místo funkce, ale potřebujete tam proměnou, nebo smyčku atd.. a to jako výraz napsat nejde. Proto má GCC {( )}, což je konstrukce, která převede libovolný blok do výrazu. Jeho hodnota je potom hodnota posledního vyhodnoceného výrazu. Proto jde napsat makro MAX pro inty tak, aby se parametry vyhodnocovaly jen jednou: #define max(a,b) ({int _a=(a), _b=(b); _a > _b ? _a : _b }) Toto makro se chová o něco lépe, než extern inline funkce se stejným kódem, protože inline funkce se napřed optimalizují odděleně a po inlinování funkce se provedou už jenom některé optimalizace a tak makra jsou stále o něco lepší pro optimizer. Této konstrukce lze také z výhodou vužít v kombinaci s asm: #define plus(a,b) ({int _a=(a) _b=(b), asm("add %0 %1":"=g" (_a):\ "0" (_a):"g" (_b):"cc");_a} Klasické makro pro max má sice nevýhodu, že své parametry vyhodnocuje několikrát, ale zase funguje třeba i pro floaty. K tomu aby i nová verze maxu chodila pro libovolný typ slouží konstrukce typeof, která nadefinuje typ podle expression dané jako parametr. #define max(a,b) ({typeof _ta=(a), _tb=(b); \ _ta _a=(a); _tb _b(b); _a > _b ? _a : _b }) Další šikovná věc je makro s proměným počtem parametru: #define eprintf(f,a ...) fprintf(stderr, f, ## a); Některé zhýralce možná napadlo psát do makra labely. Ale nejde to, protože když použijete makro dvakrát ve stejné funkci, máte tam i dva stejne labely a kompiler to neveme. Proto můžete na začátku bloku napsat __label = jméno a nadefinovat label jako lokální pro daný blok. výheň