Warum ist rsize_t definiert?
Fand ich, dass strncpy_s()
definiert ist, unter VS2013 als
errno_t __cdecl strncpy_s
(
_Out_writes_z_(_SizeInBytes) char * _Dst,
_In_ rsize_t _SizeInBytes,
_In_reads_or_z_(_MaxCount) const char * _Src,
_In_ rsize_t _MaxCount
);
rsize_t
ist:
typedef size_t rsize_t;
Ich denke, es ist ein trick gemacht, indem Visual Studio. Allerdings fand ich diese Funktion wie folgt definiert auf dieser Seite
errno_t strncpy_s
(
char *restrict dest,
rsize_t destsz,
const char *restrict src,
rsize_t count
);
Warum ist rsize_t
hier definiert?
Was ist, wenn size_t
wurde hier verwendet?
Irgendwelche speziellen Fällen zu verwenden, in diesem rsize_t
?
- Ist das nicht ein visual studio-spezifische
typedef
? Es scheint nicht in meiner header-Dateien scheint auch nicht zu erscheinen, in meinen standard-Entwurf. - Sie könnte (oder auch nicht) finden Sie einige nützliche Informationen im nutzen Sie die TR-24731 "sichere" Funktionen? zumindest gibt es einige Fragen hervorgehoben, die Sie beachten sollten, wenn Sie besorgt über Portabilität.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Denen Sie begegnet es in Microsoft ' s C++ - standard-Bibliothek, aber es kommt tatsächlich aus C. C 11, um genau zu sein, was bedeutet, es ist technisch nicht ein Teil von C++.
C 11 standard, Anhang K eingeführt, alle
_s
Funktionen und die entsprechenden Typdefinitionen, einschließlichrsize_t
. Es gibt auch einen "maximal-Wert" makroRSIZE_MAX
die groß genug für die typischen Anwendungen, aber kleiner als der tatsächliche maximale Wert den Typ an. Die sicheren Funktionen tun nichts und melden einen Fehler, wenn ein Wert vom Typrsize_t
übersteigtRSIZE_MAX
.Die Idee ist, zu vermeiden Abstürze auf Pufferüberläufe und ähnliche Fehler durch ungültige Größen, in der Regel auf die Verwendung eines negativen Wertes für die Größe. Im 2-Komplement Wert mit Vorzeichen-Darstellung (die bekannteste), eine negative Zahl entspricht einem sehr große Anzahl, wenn die Behandlung als unsigned.
RSIZE_MAX
fangen sollte solche falsche Verwendung.Unter Angabe der "Gründe" - Teil von C11 (N1570), K. 3.2:
Anzumerken ist, dass der Anhang K hat nur sehr wenige Implementierungen und es ist ein Vorschlag (N1967) zu missbilligen und/oder entfernen Sie es aus dem standard.
Diese Typdefinitionen haben semantische Bedeutung. Natürlich können Sie
size_t
hier (da ist es das gleiche), aberrsize_t
ist Ausführlicher:Es ist die ähnliche situation wie bei der Verwendung
size_t
stattunsigned int
. Es ist im Grunde das gleiche, aber unterschiedlich benannt, damit es einfach für Sie zu verstehen, was du arbeitest mit (size_t
= "Größe von etwas", das bedeutet, eine vorzeichenlose ganze Zahl).Es ist bemerkenswert, (wie vorgeschlagen, durch die Kommentare), dass
rsize_t
definiert wird, in der C-Spezifikation, aber nicht in der C++ - Spezifikation.rsize_t
definiert wird, in der C-Spezifikation, aber nicht in der C++ - Spezifikation.RSIZE_MAX
definiert werden als ..."