2009-11-02 5 views
2

J'ai une simple fonction C que je déclare que:C: const vs no const ... comment ça se compile?

int strLen(const char* str_) 
{ 
    str_ = (char*) 0; 
    return 0; 
} 

J'ai été très surpris de constater que compilant! Pourquoi donc?

considérant que cette onedoesn't compilation (ce qui est logique):

int str(const int i_) 
{ 
    i_ = 0; 
    return 0; 
} 

Répondre

15

Parce que const char* str_ dit que str_ est un pointeur sur les caractères const.

Vous pouvez modifier str_ lui-même, mais pas ce à quoi il renvoie.

int strLen(const char* str_) 
{ 
    str_ = (char*) 0; /* allowed */ 
    str_[0] = '\0'; /* not allowed */ 
    return 0; 
} 
+0

merci. c'était clair. – sivabudh

+3

Plus important encore, ce pointeur a été pris par * value *, la fonction d'origine ne fait absolument rien! – rlbond

+0

rlbond fait un point important, dans C les arguments sont passés par valeur donc si la fonction modifie ses arguments, aucun changement n'est vu en dehors de cette fonction. – Artelius

11

Dans le premier, vous changez ce que le pointeur pointe vers str_; le pointeur str_ n'est pas const; il pointe seulement vers les données const. Vous pouvez faire le pointeur const comme suit:

int strLen(const char* const str_) 
6

Cela fait suite aux conventions des déclarations C,

char *str; 

signifie que *str vous donnera un char (ou autrement dit, str est un pointeur à un char). De même,

const char *str; 

signifie que *str vous donnera un const char, ou autrement dit, str est un pointeur à une constante car. Donc, vous n'êtes pas autorisé à changer *str, mais vous pouvez changer str.

Si vous voulez faire str se const, utilisez la syntaxe suivante:

char *const str; 
+0

et utiliser 'const char * const str;' pour rendre tout constant, ou est-ce 'char const * const str'? une autre incohérence dans C ... (en réalité, les 2 déclarations sont équivalentes) –