Portál AbcLinuxu, 7. května 2025 00:03
#ifndef __LZHAM_H__Prasárna. Už by letěl. Má tam dvě podtržítka.
typedef unsigned char lzham_uint8; typedef signed int lzham_int32; typedef unsigned int lzham_uint32;
Jako proč? Neznaj typ uintN_t? A od kdy musí být char osmibitovej na všech platformách? Správně je samozřejmě použít typy uintN_least_t nebo uintN_fast_t, podle toho, jestli je potřeba šetřit s pamětí, nebo být rychlý. Tyto typy taky mají garantovanou existenci, narozdíl od uintN_t. Každopádně si ale pro výhru musíme definovat své typy, aby když uživatel pracuje s další knihovnou, co používá třeba uint32_t, musel jak kokot procpat svůj kód (static) assertama, jestli jsou typy schodné, nebo různejma krávovinama typu kontroli přetečení. Protože není bezpečné jen tak předpokládat, že nějaký lzham_uint32 bude vždy 32bit jako nějaký uint32_t. I když to má 32 v názvu, neříká to vůbec nic o tom, žě autor knihovny takto neoznačuje 64bit číslo, když už je to takový prase.
... dál zdroják nečtu, zvednul se mi kýbl ...
Co vadí na tom zdvojeném podtržítku (krom toho, že to není hezké)?
uintN_least_t, uintN_fast_t
je jen o tak maličký krůček jiné na veřejném rozhraní (interně je to putna), že je zbytečné o tom hovořit a prakticky mi naopak přijde jako vyšší záruka pevně definovaný typ konkrétní knihovnou, když už to teda není přímo uintN_t
, než least
y a fast
y, které se mohou dle platformy měnit.
unsigned char lzham_uint8;
je to samé jako u uint8_least_t lzham_uint8;
, tak bych se tím vůbec nestresoval…
Co vadí na tom zdvojeném podtržítku (krom toho, že to není hezké)?
Identifikátory začínající dvěma podtržítky jsou podle normy rezervované.
K tomu jsem se taky dopracoval ale mám to:
INC_prj_cesta_filename_H_year_or_something_elsea
#endif
okomentovaný mezi /* */
všechna makra mám prjM_jmeno
všechny „macro-konstanty“ prjD_jmeno
a makra specifické dané třídě/namespace mají
prj?_namespace_jmenoTridy_jmenoMacra
a super se mi v tom pak orientuje (pomocné makro se může jmenovat třeba jen XY, ale v rámci files-u ho na závěr undef
-uju) .
Ať už jsou dvě podtržítka na jakémkoliv místě, třeba uprostřed, je to rezervováno.
Kde přesně se tohle říká? Já v ISO C99 nic takového nevidím.
17.6.4.3.2 Global names [global.names]V C99 a C11 to není, tam se nesmí jen začínat, pravda. Ale z hlavičkových souborů, kde je1 Certain sets of names and function signatures are always reserved to the implementation:
- Each name that contains a double underscore or begins with an underscore followed by an uppercase letter (2.12) is reserved to the implementation for any use.
- Each name that begins with an underscore is reserved to the implementation for use as a name in the global namespace
#ifdef __cplusplus extern "C" { #endifpředpokládám, že se jedná o hlavičkový soubor C i C++.
btw. jak pojmenovavas promenne trid, kdyz ne s podtrzitkem ?Proč by se vůbec měly proměnné tříd pojmenovávat s podtržítkem?
#define private public
).
Myslim ze je lepsi udelat vsechno public, a private veci nejak oznacit, treba podtrzitkem, cimz rikam "pouziti na vlastni nebezpeci."
Dobre tenhle pristup shrnuje pythonni slogan "We're all consenting adults here" m_
prefix pro členské proměnné, co nejsou public, s_ pro statické, g_ pro globální. Asi úchylka, ale vyhovuje mi to, a vím přesně, co je co. Private metody buď s podtržítkem, když by měli stejný název, jako public metody, jinak bez.
Pro 'obejití access modifikátorů' tu máme 'friend'.
Podivej se treba na kod standardni kvihovny. Vsechny interni veci tam zacinaji '__'. Myslim ze je to proto aby to nahodou nejaky makro neprepsalo...Kvůli tomu, ano. Dá se o tom najít spousta článků, proč jsou standardní knihovny psaný tak hnusně s podtržítkama.
int f(int a);a nekdo pred inkludovanim toho .h nadefinuje makro:
#define a *qtak preprocesor me zmeni kod v file.h na:
int f(int *q);S manglovanim neni problem, protoze to jmeno (pokud nedas
extern "C"
) by se zamanglovalo jeste jednou, takze se do niceho netrefis...
Nevím o jakou platformu jde, a nevím přesně na co narážíš (na neexistenci unsigned typů?).
Je docela běžným řešením #ifdef HAVE_STDINT_H…
a pokud není stačí je jen dodefinovat.
PS: Jestli se nepletu tak
int8_t, int16_t, int32_t, uint8_t, uint16_t, uint32_t
jsou povinné v 2001.
boost::numeric_cast
, nebo máš vlastní cast (můj je hnusnější :)), nebo na to kašleš a pak se to někdy začne chovat jako Windows…
Myslim, ze s tim ma problem i MSVC 2010.MS se v novějších verzích MSVC (>=2012) konečně uráčil
<cstdint>
podporovat.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.