Der C-Standard (ISO/IEC 9899:2011 oder 9899:1999) definiert einen Typ ptrdiff_t
in <stddef.h>
.
Der POSIX-Standard (ISO/IEC 9945; IEEE Std 1003.1-2008) definiert einen Typ ssize_t
in <sys/types.h>
.
- Was ist der Unterschied zwischen diesen Typen (oder warum wurden beide als notwendig erachtet)?
- Gibt es eine Implementierung, bei der der zugrunde liegende Basistyp für
ssize_t
ist nicht dasselbe wie für ptrdiff_t
?
Gibt es eine Implementierung, bei der der zugrunde liegende Basistyp für ssize_t nicht derselbe ist wie für ptrdiff_t?
x86-16 mit dem großen Speichermodell. Zeiger sind weit (32-Bit), aber einzelne Objekte sind auf ein Segment beschränkt (so size_t
darf 16-Bit sein).
The Open Group Base Specifications Ausgabe 7, IEEE Std 1003.1, Ausgabe 2013, Beschreibung von <sys/types.h>
sagt:
Der Typ ssize_t ist in der Lage, Werte mindestens im Bereich zu speichern [-1, SSIZE_MAX].
Mit anderen Worten, ssize_t
ist unterschrieben, aber die Menge negativer Werte, die es darstellen kann, kann auf nur {-1} beschränkt sein.
EIN ptrdiff_t
auf der anderen Seite, hat garantiert einen symmetrischeren positiven/negativen Bereich.
Ich gebe zu, dass dies in der Praxis nicht wahrscheinlich ist ssize_t
wäre dies im negativen Bereich begrenzt, aber es ist möglich.
Ein weiterer Unterschied ist natürlich der ptrdiff_t
ist verfügbar, wenn Sie in Standard-C oder C++ programmieren, aber ssize_t
möglicherweise nicht verfügbar, es sei denn, Sie zielen auf ein Standard-POSIX-System ab.
vielleicht ist es die semantik von
ptrdiff_t
das forderte die Hinzufügung vonssize_t
? Manchmal ist ein vorzeichenbehafteter Größentyp sinnvoll, wenn man ihn zwischendurch darstellen lassen möchte-1
. Die Semantik vonptrdiff_t
ist “Unterschied zwischen zwei Zeigern”, was nicht genau die Semantik von “Größe” ist.– Johannes Schaub – litb
27. Dezember 2011 um 20:55 Uhr
Wahrscheinlich ein bisschen NIH-Paranoia in den zuständigen Stadards-Ausschüssen
– Chris Dodd
27. Dezember 2011 um 21:21 Uhr