2010-12-02 6 views
3

Mon application lit d'abord les paramètres d'un fichier conf, puis ces options peuvent être écrasées à partir des arguments cli. Après avoir chargé les paramètres de la conf, j'ai besoin de vérifier si les valeurs requises sont définies, mais je suis bloqué à faire vérifier les variables.Comment vérifier si une valeur de const char * est définie?

Exemple de code:

#include <stdio.h> 

int main() { 

const char* test; 

if (test != NULL) 
    std::cout << test << "\n"; 
else 
    std::cout << "no value set\n"; 

return 0; 
} 

Qu'est-ce que je fait de mal?

+4

Quel est le problème concret? Ce qui se produit? Que * devrait * arriver? (Vous n'avez pas initialisé 'test'.) – Flinsch

+0

re-étiqueté à c aussi bien. Même s'il y a des trucs spécifiques au C++ ici (seulement les streams, vraiment), la question (et la réponse) est C-orientée. – haylem

Répondre

7

Vous n'avez pas initialisé test. Si vous voulez qu'il soit NULL d'abord, vous devez configurer:

const char* test = NULL; 
+0

Mais si je l'initialise comme NULL, cela ne signifie-t-il pas que je ne pourrai pas changer sa valeur plus tard (parce que c'est const char *)? – codefrog

+1

@code: Non, vous avez un pointeur sur 'const char' ici. Même s'il s'agissait d'un pointeur 'const' (' const char * const'), vous pouvez seulement définir sa valeur en l'initialisant et ne pourrez pas le modifier plus tard de toute façon. –

+0

C'est 'const char *', pas 'char * const'. Un pointeur const n'est pas identique à un pointeur sur const. – Philipp

0

C et C++ n'initialisent pas des pointeurs NULL automatiquement. Si vous ne lui attribuez pas de valeur, il a toujours une valeur, il s'agit simplement d'une valeur inconnue, indéterminée. Ça pourrait être NULL, ça pourrait être autre chose.

Dans votre exemple de code, test a une valeur, mais elle est inconnue. Donc, votre if-déclaration pourrait être ou ne pas être vrai.

0

Comme une alternative qui est plus idiomatiques C++, vous pouvez utiliser une chaîne et vérifier si elle est vide après init complète:

#include <string> 

std::string test; // default constructor produces an empty string 

// do the config load 

if (test.empty()) 
{ 
    // config error 
} 

Notez que si la sémantique de données comprennent ici une valeur vide étant légitime, cette alternative n'est pas viable.

+1

Une chaîne n'est généralement pas la même chose qu'une chaîne optionnelle. Parfois, "mettre à vide" ne signifie pas la même chose que "non défini", donc c'est plus sur le modèle de données que sur l'idiome. –

+0

@Steve - c'est vrai - si la sémantique des données inclut ici une valeur vide étant légitime, cette alternative n'est pas viable. –

+0

Dans ce cas, avec cela dit, 'chaîne' est en effet plus idiomatique que 'char *' pour contenir une chaîne en C++. Interlocuteur: utilisez-le si possible! –

0

Ce n'est pas le cas.

Vous ne pouvez pas vérifier un état "défini" en C/C++ si vous n'avez pas "défini" cet état vous-même. Ne laissez pas l'initialisation jusqu'à l'implémentation de votre compilateur si vous faites quelque chose comme ça.

Initialisez votre pointeur sur NULL.

Questions connexes