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ň