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ň