Attributy funkcí
                               =-=-=-=-=-=-=-=-=-

       Opravdoví programátoři nepíšou komentáře. Dalo to práci napsat, ať
                          to tedy dá práci i přečíst.

          K   optimalizaci   se  hodí  jakákoliv  informace.  V  některých
      případech je celkem těžké, aby optimizer zjistil některé specialitky
      a  proto  mnoho  překladačů  má možnost přidat k deklaracím funkce i
      některé  přídavné  attributy  -  například  to,  že  funkce se nikdy
      nevrátí  (exit)  a  tak  není  třeba po jejím volání dále překládat.
      Většina  z  nich  to  ale řeší pomocí konstrukce #pragma. To přináší
      časté  potíže  s  preprocesorem  -  nejde  zahrnovat  do maker apod.
      Protože  je  #pragma  neportabilní  nelze  tudíž tyto věci elegantně
      přidat do portabilních programů.

          GCC  má poněkud jiné řešení - pomocí __attribute__ který se píše
      za deklaraci funkce. Nastavení takového attributu potom vypadá:

      void ahoj(void) __attribute__(const);

      Pokud chcete mít program přenositelný, stačí přidat do nějakého
      headeru konstrukci:

      #ifdef __GCC__
      # define CONST(f) f __attribute__const
      #else
      # define CONST(f) f
      #endif

      a potom používat pouze:

      void CONST(ahoj(void));

      Jsou k dispozici následující attributy:

      noreturn
          říká, že funkce se nikdy nevrátí - jako exit
      const
          funkce  nedělá nic jiného, než že se koukne na své parametry a z
          nich  vyvodí  výsledek,  bez  dalších  vedlejších  efektů,  nebo
          prohlížení  paměti. Compiler potom dělá stejné optimalizace jako
          na  operátor.  Příkladem  takovych funkcí je například abs, sin,
          cos... ale například rand to už není
      regparm(počet)
          Prvních  počet parametrů se bude předávat v registru. To urychlí
          volání funkce. GCC umí předávat v registrech i defaultně, je ale
          nutné pro to překompilovat knihovny.
      constructor
          funkce se zavolá před provedením main
      destructor
          funkce se zavolá před skončením programu
      stdcall
          funkce bude používat pascalácké volací konvence
      cdecl
          použijí se C konvence, pokud pascalácké volání je jako default
      format(typ,format,odkud)
          Funkce  typu  printf  a scanf nemají žádnou kontrolu typů. To je
          zdrojem  častých  chyb  a  proto  GCC umí tyto typy kontrolovat.
          Pokud  uvedete  tento  attribut  u  své  funkce, která má stejné
          konvence,  GCC  to  bude  kontrolovat i tam. Typ může být printf
          nebo scanf
      unused
          Compiler nebude vypisovat warning, kdyz funkce je neppoužita.
      weak
          Weak  je  něco jako static nebo global. Pokud v knihovně uděláte
          globální  proměnou,  je  vidět  zvenku a aplikace ji může omylem
          přepsat. Pokud je ale weak, je lokální pro danou knihovnu.
      alias(fce)
          Funkce je pouze alias pro funkci fce
      section(jmeno)
          Funkce se uloží do jiné sekce - linker potom může tyto sekci dát
          do  jiné  části výsledku a tak jdou dělat věci jako, že na konci
          je inicializační kód, který se potom uvolní z paměti.


            výheň