Comment déclarez-vous les constantes de chaîne dans C?

Je sais que c est assez idiomatique, ou plutôt bon, de déclarer les constantes numériques en tant que enum s au lieu de les #define .

 /* bad style */ #define MAXLINE 1024 /* good/better style */ enum { MAX_LINE = 1024 }; 

Existe-t-il une règle équivalente pour la définition des constantes de chaîne?

 /* is this good style? */ #define HELLO "Hello World" /* or is this better? */ const char *HELLO2 = "Howdy"; 

Que préfères-tu? Si possible, montrer des inconvénients de l’une ou l’autre méthode.

Il y a une autre route (au moins) vers Rome:

 static const char HELLO3[] = "Howdy"; 

( static – optionnel – est d’empêcher le conflit avec d’autres fichiers). Je préférerais celui-ci sur const char* , car alors vous pourrez utiliser sizeof(HELLO3) et vous n’avez donc pas à reporter à l’exécution ce que vous pouvez faire à la compilation.

La définition présente cependant l’avantage de la concaténation à la compilation (pensez à HELLO ", World!" ) Et vous pouvez également sizeof(HELLO) .

Mais vous pouvez également préférer const char* et l’utiliser sur plusieurs fichiers, ce qui vous permettrait d’économiser un peu de mémoire.

En bref, cela dépend.

Un avantage (même minime) de la définition des constantes de chaîne est que vous pouvez les concaténer:

 #define bonjour "bonjour"
 #définir le monde "monde"

 met (HELLO WORLD);

Je ne suis pas certain que ce soit vraiment un avantage, mais c’est une technique qui ne peut pas être utilisée avec const char *.

Si vous voulez une “chaîne de caractères const” comme le dit votre question, je choisirais vraiment la version que vous avez indiquée dans votre question:

 /* first version */ const char *HELLO2 = "Howdy"; 

En particulier, j’éviterais:

 /* second version */ const char HELLO2[] = "Howdy"; 

Raison: Le problème avec la deuxième version est que le compilateur fera une copie de la chaîne entière “Howdy”, PLUS que cette chaîne est modifiable (donc pas vraiment const).

D’autre part, la première version est une chaîne de caractères accessible par le pointeur const HELLO2, et personne ne peut le modifier.

Le principal inconvénient de la méthode #define est que la chaîne est dupliquée à chaque fois qu’elle est utilisée. Vous pouvez donc en obtenir de nombreuses copies dans l’exécutable, ce qui la rend plus grande.