#11 KIIV
Samozřejmě, nijak nepopírám, že se jedná o heuristické pravidlo. Ale to pravidlo je pravdivé v 99 % případů a ten zbytek jsou dost speciální věci. A přístup embedářů "u nás je to přece jinak, pro nás taková pravidla nemají smysl" je chyba.
Konkrétně z vašich příkladů. errno je letitá ostuda standardní knihovny, za kterou se její autoři stydí, a která na vícevláknových systémech musí být řešená nějakým zpraseným mechanismem v překladači. Rozhodně se nejedná o příklad dobře použité globální proměnné.
stdout a spol. jsou v principu singletony. Singletony jsou obecně zlo. Což poznáte přesně v okamžiku, kdy se pokusíte napsat první automatický test kódu, který k singletonu přistupuje. Např. pokud budete chtít otestovat, zda váš kód generuje správný výstup, zjistíte, že jste v koncích. A bude před vámi dlouhá a protivná práce, kdy si do daných funkcí přidáte argument FILE* a stdout budete přepisovat na něj.
Osobně bych si představoval, že stdout bude součástí kontextu, který program dostává jako argument funkce main. Tak to není, takže asi není lepší způsob, než ho mít jako globální proměnnou. Ale používat ho globálně problém je a programátor by se tomu vyhýbat měl.
Když už jste zmínil premature optimization, tak globální přístup k proměnné je právě krystalická ukázka. Ano, může se časem ukázat, že předávání proměnných program zpomaluje, a pak se uchýlit ke globálnímu přístupu. Ale skutečně pouze v případě, že to má smysl.
Nevím, jestli chápu vaše tvrzení "když se program napíše úplně blbě..." Úplně blbě napsaný program je právě obvykle důsledek předčasných optimalizací a je to přesně ten důvod, proč je nedělat a jsou považované za "root of all evil". Pokud to ovšem někdo používá jako výmluvu pro nedělání optimalizací, které nekazí návrh (od detailů jako používat reference místo kopie objektů až po výběr algoritmů s vhodnou složitostí), pak je to pochopitelně špatně.