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í
- cppreference.com - std::size_t
- cppreference.com - size_t
- stackoverflow.com - Difference between size_t and std::size_t
- stackoverflow.com - Does “std::size_t” make sense in C++?
- programmers.stackexchange.com - Is it poor form to use C features such as the size_t type instead of their c++, such as std::size_t?