2008-10-26 6 views
6

Un answer to one of my questions inclus la ligne de code suivante:Qu'est-ce que std :: safe_string?

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

L'intention semble être une enveloppe autour d'une chaîne littérale (donc probablement pas d'allocation a lieu). Je n'ai jamais entendu parler de safe_string et aucun, apparemment, n'a google (je ne pouvais pas non plus le trouver dans la norme 98).

Est-ce que quelqu'un sait de quoi il s'agit?

Répondre

8

Après la recherche google code search (j'aurais pensé de cette première ...) je trouve ceci:

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

qui convertit NULL s à zéro des chaînes de longueur. Bien que cela ne soit pas standard, il s'agit probablement d'une sorte d'extension dans une implémentation de LIST spécifique dont il a été question dans la réponse.

5

Il n'y a pas une telle chose comme std::safe_string

6

Il n'y a pas safe_string standard. La chaîne safe_string que vous voyez dans la réponse de ce répondeur provient de ce qui ressemble à une bibliothèque d'utilitaires d'extensions STL privées.

Google for "stlext/stringext.h" et vous verrez la même bibliothèque référencée dans un message sur un autre forum.

+0

Les résultats de votre recherche n'incluent pas "safe_string". – Motti

0

Il ne fait pas partie de la norme C (mais il faudrait peut-être?)

J'utilise le même genre de fonction d'aide pour éviter un std :: string lancer une exception avec une chaîne de char NULL *. Mais il était plus quelque chose comme:

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

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

Pas de frais généraux, et aucun crash d'un std :: string quand je nourrirai une chaîne char * qui pourrait être NULL, mais que, dans ce cas particulier, doit se comporter comme chaîne vide.

+0

Pourquoi avez-vous besoin de g_strEmptyString, "" ne fait pas l'affaire. – Motti

+0

L'utilisation de "" crée un objet littéral de 1 octet. Si le compilateur n'est pas intelligent, chacun est différent et pourrait donc gonfler le code. Je soupçonne que le compilateur est assez intelligent pour optimiser cela et donc c'est un faux gain et complique le code. –

+1

Je ne suis pas à l'aise avec l'idée de renvoyer des pointeurs ou des références à des objets locaux, même si le compilateur pourrait être supposé gérer chaque cas correctement (et faire "" survivre au retour). – paercebal