2008-10-26 12 views
6

answer to one of my questions zawarte następujący wiersz kodu:Co to jest std :: safe_string?

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

Zamiarem wydaje się być otoki wokół ciąg literału (tak prawdopodobnie nie przydział odbywa). Nigdy nie słyszałem o safe_string i ani, podobno, nie ma google (ani nie mogłem znaleźć go w standardzie 98).

Czy ktoś wie o co chodzi?

Odpowiedz

8

Po wyszukaniu google code search (mam pomyśleli o tym pierwszym ...) Znalazłem to:

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

który przekształca NULL s do zerowej długości strun. Chociaż nie jest to standard, jest to prawdopodobnie pewnego rodzaju rozszerzenie w konkretnej implementacji STL, o której mowa w odpowiedzi.

5

Nie ma czegoś takiego jak std::safe_string

6

Nie ma standardowego safe_string. Safe_string, który widzisz w odpowiedzi tego odbierającego, pochodzi z czegoś, co wygląda jak prywatna biblioteka narzędzi rozszerzeń STL.

Google for "stlext/stringext.h", a zobaczysz tę samą bibliotekę, do której odwołuje się post na innym forum.

+0

Wyniki wyszukiwania nie obejmują "safe_string". – Motti

0

To nie jest częścią standardu C++ (ale chyba powinno być?)

I zostały z wykorzystaniem tego samego rodzaju funkcji pomocnika, aby uniknąć std :: string wyjątek z NULL char * string. Ale to było coś więcej:

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

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

Nie napowietrznej, a nie zderzenia z std :: string, gdy karmię to ciąg char *, który może być NULL jednak, że w tym konkretnym przypadku, należy zachowywać się jako pusta struna.

+0

Dlaczego potrzebujesz g_strEmptyString, nie "" załatwiaj sprawy. – Motti

+0

Użycie "" tworzy 1-literowy obiekt literalny. Jeśli kompilator nie jest sprytny, każdy z nich jest inny i może potencjalnie nadąć kod. Podejrzewam, że kompilator jest wystarczająco inteligentny, aby zoptymalizować to, stąd jest to fałszywy zysk i komplikuje kod. –

+1

Nie czuję się komfortowo z pomysłem zwracania wskaźników lub odwołań do lokalnych obiektów, nawet jeśli kompilator mógłby poprawnie obsłużyć każdy przypadek (i "przetrwać powrót"). – paercebal