55 votes

Obsolète conversion de chaîne de caractères littérale de 'char*'

J'ai un programme qui déclare un tableau de chaînes de caractères comme ceci:

char *colors[4] = {"red", "orange", "yellow", "blue"};

Mais j'ai l'-dessus d'avertissement du compilateur. Il compile mais je préfère utiliser la non-déconseillé façon(si il y en a un). J'ai essayé de savoir ce que cela signifie, mais je n'arrive pas à le comprendre. J'ai entendu parler de l'utilisation de 'const' avant de 'char' œuvres, mais il serait utile si quelqu'un peut expliquer ce que l'erreur signifie. Merci.

75voto

d_inevitable Points 2357

Les chaînes de caractères que vous saisissez: "rouge", "organge", etc. sont "littéral", parce qu'ils sont définis dans le code du programme lui-même (ils ne sont pas lus directement à partir du disque, la saisie de l'utilisateur /stdin, etc.).

Cela signifie que, à tout moment, si vous essayez d'écrire à votre colors vous sera directement accès à votre entrée d'origine et donc de le modifier. Ce serait la cause de certains indésirables des erreurs d'exécution.

Déclarer const sera assurez-vous que vous n'essaiera jamais d'écrire sur ce pointeur et une telle erreur d'exécution peut être évitée.

const char *colors[4] = {"red", "orange", "yellow", "blue"};

Si jamais vous vous sentez comme de la modification de ces valeurs au moment de l'exécution, vous devez copier les chaînes d'abord.

10voto

BЈовић Points 28674
"red", "orange", "yellow", "blue"

ce sont de chaîne constante. La création d'un non-const pointeur vers une chaîne constante est faux, d'où l'avertissement. Au moment où vous êtes l'obtention d'un avertissement, mais il devrait être une erreur, puisqu'il est déconseillé en c++03, et interdit en c++11.

5voto

tiktak Points 513

Ces réponses sont correctes.

Notez que si vous avez une fonction nécessitant un tableau de caractères comme argument et vous passez cet argument comme ceci:

foo ("bar");

le même message d'avertissement sera affiché. Dans ce cas, vous pouvez soit :

1) Modifier comme ceci, comme cela est expliqué dans la première réponse:

void foo (char[] str) { printf(str); }

const char param[] = "bar";
foo (param);

2) Envisager l'utilisation d'un standard C++ string, comme suit:

void foo (std::string theParam) { std::cout << theParam; }

foo ("bar");

À mon humble avis, tant que pas de réel problème de performance, et vous ne travaillez pas avec les bibliothèques C, ou si vous êtes à la construction d'une bibliothèque C++ pour les autres à utiliser, vous devriez plutôt travailler avec C++ immuable des chaînes et de leurs fonctionnalités.

Si Unicode est une exigence, l'appui en C++ est "terrible" comme expliqué ici. Cette question vous donne quelques indices (principalement: l'utilisation d'IBM soins intensifs de la bibliothèque). Si vous avez déjà Qt dans votre projet, QString feront aussi l'affaire, et il en sera de Gettext.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X