2008-10-30 4 views
2

Dans l'extrait de code ci-dessous, puis-je remplacer char * par const char * et supprimer l'appel de la fonction strdup() et prendre directement la valeur optarg définie par getopt()? Je suis conseillé d'utiliser const char * pour ignorer l'utilisation de la fonction strdup. Appréciez l'aide à l'avance.Indique si const char * et strdup ont la même fonction lorsqu'ils sont utilisés avec getopt dans C?

/* Code Snippet */ 
char *dir = NULL; 
char *bld = NULL; 
int chr; 

while ((chr = getopt(argc, argv, "d:a:b:f:")) != -1) { 

switch (chr) { 

    case 'd': //Directory parameter 
    dir = strdup(optarg); 
    if (dir == NULL) { /*Error*/ } 

    case 'b': //Build parameter 
    bld = strdup(optarg); 
    if (bld == NULL) { /*Error*/ } 
    ...other code... 
} 
} 

Je ne comprends vraiment pas la nécessité de le faire.

Modifier: Merci pour les réponses. C'était vraiment utile. J'ai modifié le code à const char * et j'ai ignoré l'appel de strdup.

Merci, Liju

+0

Je recommande d'utiliser un tiret plus grand qu'un caractère par niveau; il est difficile de voir où les indentations s'alignent. Personnellement, j'utilise 4 espaces; le noyau Linux utilise 8 espaces (en réalité, un arrêt de tabulation défini à 8). –

+1

J'utilise l'espacement des tabulations 4. Mais quand j'ai copié le code ici, il ne montre pas les espaces, donc je l'ai aligné. Désolé pour le bazar. –

Répondre

2

Comme optarg est déclaré comme 'extern char *optarg;', vous n'avez pas besoin d'utiliser 'const char *', mais il est recommandé de ne pas modifier les arguments de votre programme. Cela dépendra plus, je suggère, si les fonctions que vous appelez avec vos variables dir et bld sont const-correctes. Si elles sont votre code, vous pouvez les faire ainsi; sinon, vous pouvez trouver plus simple de garder les variables non-const. Votre appel à 'strdup()' (qui est standard dans POSIX, mais pas dans C - comme dans ISO/CEI 9899: 1999) est inutile.

2

Si je comprends bien (http://linux.die.net/man/3/optarg) est que les points de OPTARG au contenu du tampon de argv de sorte que le strdup n'est pas nécessaire. La suggestion d'utiliser constchar * semble être une idée raisonnable.

2

Les deux sont de bons conseils. Vous ne voulez probablement pas modifier dir et bld, donc les déclarer comme const char * au lieu de char * est utile dans tous les cas parce que le compilateur détectera plus d'erreurs de codage. En se débarrassant de la strdup vous évitez juste une copie inutile (en fonction de ce que vous faites avec dir ensuite), mais cela crée un alias à votre optarg.

Questions connexes