Was sind die Unterschiede zwischen size_tund std::size_tin Bezug darauf, wo sie deklariert werden, wann sie verwendet werden sollten und welche anderen Unterscheidungsmerkmale?
Was sind die Unterschiede zwischen size_tund std::size_tin Bezug darauf, wo sie deklariert werden, wann sie verwendet werden sollten und welche anderen Unterscheidungsmerkmale?
Antworten:
C size_tund C ++ std::size_tsind 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 cstddefHeader) 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_tim stdNamespace 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_tohne 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_tist 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::Tdefinierten Varianten verlassen ?
#include <stddef.h>dann std::size_tmöglicherweise verfügbar sind oder nicht. Wenn Sie #include <cstddef>dann std::size_tverfügbar sind, aber size_tmö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_tniemals 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_tund Sie könnten auch bekommen ::size_t(aber es ist nicht garantiert). Wenn Sie einschließen, werden <stddef.h>Sie garantiert bekommen ::size_tund 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.