2008-10-26 4 views
6

Ein answer to one of my questions enthalten die folgende Codezeile:Was ist std :: safe_string?

label = std::safe_string(name); // label is a std::string 

Die Absicht scheint ein Wrapper um ein Zeichenfolgenliteral (so vermutlich keine Zuordnung stattfindet) zu sein. Ich habe noch nie von safe_string gehört und keiner hat anscheinend google (noch konnte ich es in der 98-Norm finden).

Weiß jemand, worum es geht?

Antwort

8

Nach google code search suchen (ich zuerst gedacht haben sollte ...) ich dies gefunden:

//tools-cgi.cpp 
string safe_string (const char * s) 
{ 
    return (s != NULL) ? s : ""; 
} 

Welche NULL s auf Null Zeichenfolgen umwandelt. Obwohl dies kein Standard ist, ist es wahrscheinlich eine Art Erweiterung in einer bestimmten STL-Implementierung, auf die in der Antwort Bezug genommen wurde.

5

Es gibt nicht so etwas wie std::safe_string

6

Es gibt keine Standard-safe_string ist. Die safe_string, die Sie in der Antwort dieses Beantworters sehen, stammt aus einer Bibliothek, die wie eine private STL-Erweiterung aussieht.

Google for "stlext/stringext.h" und Sie sehen die gleiche Bibliothek in einem Beitrag in einem anderen Forum verwiesen.

+0

Die Ergebnisse Ihrer Suche beinhalten nicht "safe_string". – Motti

0

Es ist nicht Teil von C++ Standard (aber vielleicht sollte es sein?)

Ich war die gleiche Art von Helfer-Funktion ein std zu vermeiden :: string eine Ausnahme mit einer NULL-char * Zeichenfolge werfen. Aber es war mehr so ​​etwas wie:

// defined somewhere else as "" 
extern const char * const g_strEmptyString ; 

inline const char * safe_string(const char * p) 
{ 
    return (p) ? (p) : (g_strEmptyString) ; 
} 

Kein Overhead und kein Absturz eines std :: string, wenn ich es füttern ein char * Zeichenfolge, die NULL sein könnte, aber dass in diesem speziellen Fall sollte als verhalten leerer String.

+0

Warum brauchen Sie g_strEmptyString, tut nicht "" den Trick. – Motti

+0

Verwendung von "" erstellt ein 1-Byte-Literalobjekt. Wenn der Compiler nicht intelligent ist, ist jeder anders und könnte daher möglicherweise den Code aufblähen. Ich würde vermuten, dass der Compiler schlau genug ist, um dies zu optimieren und somit ist dies ein falscher Gewinn und verkompliziert den Code. –

+1

Ich fühle mich nicht wohl mit der Idee, Zeiger oder Verweise auf lokale Objekte zurückzugeben, auch wenn der Compiler mit jedem Fall korrekt umgehen könnte (und "" die Rückkehr überleben könnte). – paercebal

Verwandte Themen