Jste zde

Zajímavosti z C++: size_t vs std::size_t

Možná jste se již setkali s C++ kódem, kde se místo size_t využívalo std::size_t. V tomto krátkém příspěvku se dozvíte, jaký je v nich rozdíl a který z nich používat.

size_t

size_t je standardní Céčkový typedef na implementačně závislý bezznaménkový typ, jež je výsledkem např. operátoru sizeof. Tento typedef je definován ve standardním hlavičkovém souboru stddef.h. Je důležitý v tom, že umožňuje uchovat maximální velikost libovolného objektu jakéhokoliv typu (i např. pole). Jinými slovy, ať už si vytvoříte libovolně velké pole, můžete mít jistotu, že se vám jeho velikost podaří uložit do proměnné typu size_t.

std::size_t?

To bylo ale Céčko. Nyní k C++. Jak jistě víte, v C++ můžete #includovat i Céčkové hlavičkové soubory. Tedy pokud #includujete stddef.h, můžete používat size_t. Další možností je však #includovat cstddef (C++ ekvivalent stddef.h). V něm je definován std::size_t, neboli size_t ve standardním jmenném prostoru std. Jedná se o ten samý typ. Jen je ve standardním prostoru jmen.

Který z nich bych měl v C++ používat?

Je to jednoduché. Pokud #includujete standardní hlavičkový soubor cstddef, tak používejte std::size_t. Pokud #includujte stddef.h, používejte size_t.

Ale jak to, že mohu používat size_t i u cstddef?

Někdo určitě namítne, že měl #includován cstddef, ale zároveň mohl používat size_t, aniž by použil using namespace std;. Jak to? Důvodem je, že překladač může v cstddef #includovat stddef.h a tak vám size_t zpřístupnit. Na toto se ale nelze spoléhat, protože norma C++ říká v [Annex D.5, §3] následující: It may also provide these names within the global namespace. Tedy překladač jej může zpřístupnit, ale taky nemusí. Proto pokud #includujete cstddef, tak používejte výhradně std::size_t (nebo using std::size_t; či pokud opravdu není zbytí, tak using namespace std;).

A co další typedefy, například int32_t?

To, co jsem psal výše, se týká i další typdefů, včetně int32_t a dalších. Tedy pokud v C++ #includujete cstdint, tak používejte výhradně std::int32_t místo int32_t atd.

Další čtení

Přidat komentář