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

Od Petr Zemek, 2012-04-14

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.

Obsah tohoto pole je soukromý a nebude veřejně zobrazen.

Filtrované HTML (využíváno)

  • Povolené HTML značky: <a href hreflang> <em> <strong> <cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <table>
  • Zvýraznění syntaxe kódu lze povolit přes následující značky: <code>, <blockcode>, <bash>, <c>, <cpp>, <haskell>, <html>, <java>, <javascript>, <latex>, <perl>, <php>, <python>, <ruby>, <rust>, <sql>, <text>, <vim>, <xml>, <yaml>.
  • Řádky a odstavce se zalomí automaticky.
  • Webové a e-mailové adresy jsou automaticky převedeny na odkazy.
CAPTCHA
4 + 0 =
Vyřešte tento jednoduchý matematický příklad a vložte výsledek. Např. pro 1+3 vložte 4.
Nějak se mi tady rozmohl spam, takže poprosím o ověření.