_ctime64 und _ctime64_s
-
Hallo zusammen.
Verwende momentan eine Klasse in der die Funktion _ctime64 aufgerufen wird. Nun erhalte ich die Warnung:
'_ctime64': This function or variable may be unsafe. Consider using _ctime64_s instead.Die Funktion _ctime64 wird momentan wie folgt aufgerufen:
char* timeline; struct __timeb64 timebuffer; timeline=_ctime64(&(timebuffer.time));_ctime64_s benötigt nun allerdings einen weiteren Parameter. -> char(&_Buffer)[_Size]
hier weiß ich überhaupt nicht was übergeben. Kann mir da jemand helfen.
-
_ctime64 ist nicht reentrant. _ctime64_s ist Microsofts Methode, das zu umschiffen. Gedacht ist das als
char timeline[26]; if(0 == _ctime64_s(timeline, 26, &timebuffer.time)) { /* Erfolg */ } else { /* Fehler */ }Die 26 ist in der Dokumentation als ausreichende Bufferlänge angegeben. Längere Buffer schaden natürlich nichts, wären aber verschwenderisch.
Ansonsten gehört der Thread eigentlich ins WinAPI-Forum. Das POSIX-Gegenstück zu dieser Funktion heißt _ctime_r.
-
Entschuldigung. Das POSIX-Gegenstück heißt ctime_r (ohne Unterstrich am Anfang).
-
Dank dir mal.
Das wäre dann die Überladung. Wie sieht es mit dem Aufruf in der ersten Version aus?
-
Ah, das hatte ich gar nicht gesehen. Der Aufruf müsste so gehen:
char timeline[26]; if(0 == _ctime64_s(timeline, &timebuffer.time)) { /* Erfolg */ } else { /* Fehler */ }Die Funktionsvorlage wird wohl etwa so aussehen:
template <size_t size> errno_t _ctime64_s( char (&buffer)[size], const __time64_t *time ) { return _ctime64_s(buffer, size, time); }Der Unterschied zur anderen Variante ist, dass der Compiler die Länge des übergebenen Buffers selbst feststellt. Das funktioniert natürlich nur, wenn er das kann, also mit Arrays wie oben gezeigt. Wenn du da einen Zeiger reinzustopfen versuchst, geht das schief, weil sich dieser nicht an char(&)[size] binden lässt.