Jste zde

Syntaktické srandy v C a C++: typedef nemusí být vždy na začátku řádku

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.

Přidat komentář