Warum in msvc++ wir haben _snprintf, während andere Compiler können snprintf
Was "_" bedeutet? Warum Microsoft fügt dieses Zeichen am Anfang?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was "_" bedeutet? Warum Microsoft fügt dieses Zeichen am Anfang?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bezeichner im globalen Namensraum ab
_
sind reserviert für die Umsetzung._snprintf
ist nur eine Funktion, die die Implementierung (Visual Studio) zur Verfügung gestellt hat. Die Begründung dafür, Visual Studio implementiert C89, undsnprintf
ist Teil eines später C99-standard.Außerdem, dass die Semantik der beiden Funktionen unterscheiden sich in der Rückkehr geben, die in
snprintf
ist immer die Anzahl der Zeichen, die den formatierten string nimmt (ob es genug Platz im Puffer ist oder nicht, während_snprintf
zurück eine negative Zahl, wenn es nicht genug Platz im Puffer.Ist, keinen Puffer zuweisen, das gerade groß genug für die Ausgabe, die Sie tun können:
Nicht mit
_snprintf
als nur die information, dass die Funktion ergibt wieder, dass die derzeitige Größe ist nicht genug.snprintf()
war noch nicht Teil der Norm auf die Zeit, die Microsoft C runtime begann, Sie zu unterstützen.Da der Funktionsprototyp wurde nicht standardisiert, und die Entwickler nicht wollen, verwenden Sie den Namen
snprintf
(im Fall der standard nachträglich einen anderen Prototyp), entschieden Sie sich zum hinzufügen eines führenden Unterstrich zu Kennzeichnen, wird die Funktion als eine Microsoft-Erweiterung der standard.Hinzufügen, um die oben
gibt es richtige C99
snprintf()
undvsnprintf()
seit Visual Studio 2015werden und Sie sich nicht selbst auslösen, die bekannt unsichere Funktion deprecation Warnung.
_snprintf_s()
oder_vsnprintf_s()
, während vorausgesetzt, sind "sichere Variante" von der MSVC-spezifische Funktionen, die mit der nicht-C99-Verhalten.Abgesehen von einem anderen Rückgabewert bei nicht ausreichend großer Puffer (beschrieben in David ' s Antwort), Funktionen von
_sn...
Gruppe unterscheiden sich von den standard -snprintf
in einem anderen wichtigen Zusammenhang. Wenn der Ziel-Puffer zu kurz von nur einem Zeichen, die_sn...
Funktionen betrachten Sie diese situation ein "Erfolg".Im detail, wenn der Ziel-Puffer ist lang genug, um die ganzen daraus resultierenden Abfolge aber ohne das abschließende null-Zeichen, die
_sn...
Funktionen nicht abschneiden, das Ergebnis, schreiben Sie nicht das abschließende null in den Ziel-Puffer und return die Größe des Puffers als Ergebnis. Also, im Allgemeinen Fall das Ergebnis nicht garantiert ist, werden null-terminiert ist.In der gleichen situation,
snprintf
verwirft das Letzte Zeichen in der resultierenden Sequenz und schreiben null-terminator an seinem Platz. Das Ergebnissnprintf
ist immer null-terminiert ist.