Was sind die Unterschiede zwischen size_t
und std::size_t
in Bezug darauf, wo sie deklariert werden, wann sie verwendet werden sollten und welche anderen Unterscheidungsmerkmale?
Was sind die Unterschiede zwischen size_t
und std::size_t
in Bezug darauf, wo sie deklariert werden, wann sie verwendet werden sollten und welche anderen Unterscheidungsmerkmale?
Antworten:
C size_t
und C ++ std::size_t
sind beide gleich.
In C ist es in <stddef.h>
und in C ++ definiert, in <cstddef>
dessen Inhalt der C-Header identisch ist (siehe das folgende Zitat). Es ist als vorzeichenloser Integer-Typ des Ergebnisses des Operators sizeof definiert .
C Standard sagt in §17.7 / 2,
size_t ist der vorzeichenlose Integer-Typ des Ergebnisses des Operators sizeof
Und C ++ Standard sagt (über cstddef
Header) in §18.1 / 3,
Der Inhalt entspricht dem Standard-C-Bibliotheksheader mit den folgenden Änderungen .
Also ja, beide sind gleich; Der einzige Unterschied besteht darin, dass C ++ size_t
im std
Namespace definiert .
Bitte beachten Sie auch, dass in der obigen Zeile auch "mit den folgenden Änderungen" steht, auf die nicht Bezug genommen wird size_t
. Es bezieht sich eher auf die neuen Ergänzungen (meistens), die C ++ in der Sprache (nicht in C vorhanden) vorgenommen hat und die ebenfalls im selben Header definiert sind.
Wikipedia hat sehr gute Informationen über Reichweite und Speichergröße von size_t:
Bereich und Speichergröße von size_t
Der tatsächliche Typ von size_t ist plattformabhängig . Ein häufiger Fehler besteht darin, anzunehmen, dass size_t mit int ohne Vorzeichen identisch ist, was zu Programmierfehlern führen kann, [3] [4] beispielsweise beim Übergang von einer 32- zu einer 64-Bit-Architektur.
Gemäß dem ISO C-Standard von 1999 (C99) ist size_t ein vorzeichenloser Integer-Typ mit mindestens 16 Bit.
Und den Rest können Sie von dieser Seite auf Wikipedia lesen .
size_t
ohne using namespace std;
oder zu sagen using std::size_t;
. Die meisten Compiler erlauben dies jedoch, und der Standard erlaubt es ihnen ausdrücklich, dies zuzulassen (§D.5 / 3).
<cstddef>
kann deklariert werden oder nicht ::size_t
, sodass Sie sich nicht darauf verlassen können, dass er vorhanden ist oder fehlt, es sei denn, Sie enthalten ausdrücklich einen <stddef.h>
anderen Header aus der C-Bibliothek, der ihn garantiert deklariert.
::size_t
ist zB in vorhanden <stddef.h>
, so dass Sie es nicht immer mit qualifizieren müssen std::
.
Ab C ++ 03 "17.4.3.1.4 Typen":
Für jeden Typ T aus der Standard C-Bibliothek (Fußnote 169) sind die Typen :: T und std :: T der Implementierung vorbehalten, und wenn definiert, muss :: T mit std :: T identisch sein.
Und Fußnote 169:
Diese Typen sind clock_t, div_t, FILE, fpos_t, lconv, ldiv_t, mbstate_t, ptrdiff_t, sig_atomic_t, size_t, time_t, tm, va_list, wctrans_t, wctype_t und wint_t.
std::T
definierten Varianten verlassen ?
#include <stddef.h>
dann std::size_t
möglicherweise verfügbar sind oder nicht. Wenn Sie #include <cstddef>
dann std::size_t
verfügbar sind, aber size_t
möglicherweise nicht.
std::
und der Absatz besagt, dass sie möglicherweise auch im Namespace der obersten Ebene definiert werden. Wenn dies der Fall ist, müssen sie in std::
und auf oberster Ebene identisch definiert werden. Die meisten Compiler enthalten nur den C-Header und importieren die Namen in std::
, sodass die Symbole in beiden definiert werden.
std::
Varianten von Bezeichnern, die vom C-Ufer kommen. Ich bleibe bei <xxxxx.h>
den Standard-C-Headern - es war nie ein Problem. Also würde ich verwenden <stddef.h>
und size_t
niemals darüber nachdenken std::size_t
; Tatsächlich fällt mir nie ein, dass es eine gibt (oder geben könnte) std::size_t
.
std :: size_t ist in der Tat stddef.h ‚s size_t .
cstddef gibt Folgendes an:
#include <stddef.h>
namespace std
{
using ::ptrdiff_t;
using ::size_t;
}
... die vorherige Definition effektiv in den Standard-Namespace bringen.
<cstddef>
und erwarten zu bekommen ::size_t
, aber wenn Sie einschließen, werden <stddef.h>
Sie bekommen std::size_t
.
<stddef.h>
wird nur Sie bekommen ::size_t
.
<cstddef>
Sie garantiert bekommen std::size_t
und Sie könnten auch bekommen ::size_t
(aber es ist nicht garantiert). Wenn Sie einschließen, werden <stddef.h>
Sie garantiert bekommen ::size_t
und Sie könnten auch bekommen std::size_t
(aber es ist nicht garantiert). In C ++ 03 war das anders, aber das war praktisch nicht umsetzbar und wurde als Fehler behoben.