Dneska se v krátkosti podíváme na jednu srandu z C a C++, konkrétně na to, že pozice jistých specifikátorů (např. typedef
) nehraje roli.
Pro jednoduchost se omezím pouze na ISO C99; v ISO C++98 je situace obdobná.
O co jde?
Určitě pravidelně používáte typedef
, abyste zkrátili a zpřehlednili váš kód. Typické použití vypadá následovně:
typedef const int *slot_pos_t;
Když si ale vyzkoušíte přeložit následující kód, tak s překvapením zjistíte, že překladač neprotestuje, a vše funguje tak, jak má:
const int typedef *slot_pos_t;
Proč to funguje?
typedef
patří mezi tzv. storage-class specifiers [ISO C99 6.7.1], a to z důvodu syntaktické jednotnosti (viz [ISO C99 6.7.1.3]). Jelikož tyto specifikátory mohou být použity na "téměř libovolném místě", tak i typedef
lze použít na "téměř libovolném místě". Mezi další specifikátory z této kategorie patří extern
, static
, auto
a register
.
Kam dávat ono klíčové slovo typedef?
Doporučuji se výše zmíněné srandě vyhnout a klíčové slovo typedef
dávat na začátek řádku. Jiným umístěním totiž akorát zmatete čtenáře vašeho kódu, protože tímto jdete proti zažitým konvencím. gcc
v takovém případě vypisuje varování (warning: ‘typedef’ is not at beginning of declaration
). Stejná situace platí pro ostatní specifikátory.