420 votes

Comment se débarrasser des ' désapprouvé la conversion de la constante de chaîne à ' char *'' avertissements dans GCC ?

Donc, je suis en train de travailler sur une extrêmement grande base de code, et récemment mis à niveau vers gcc 4.3, qui déclenche maintenant cet avertissement:

avertissement: déconseillé de conversion de chaîne de caractères constante de ‘char*'

De toute évidence, la bonne façon de résoudre ce problème est de trouver chaque déclaration comme

char *s = "constant string";

ou l'appel de fonction comme:

void foo(char *s);
foo("constant string");

et de faire leur const char des pointeurs. Cependant, cela ne signifie toucher 564 fichiers, minimum, ce qui n'est pas une tâche que je souhaite effectuer à ce point dans le temps. Le problème est que, actuellement, je suis en cours d'exécution avec -werror, j'ai donc besoin d'une certaine manière à l'étouffer ces mises en garde. Comment puis-je le faire?

575voto

John Points 632

Toutes les fonctions dans lequel vous passez des littéraux de chaîne doit utiliser comme le type au lieu de `` .

Si vous allez à réparer quelque chose, réparer droite.

237voto

DGentry Points 10759

Je crois en passant `` à gcc supprimera cet avertissement.

70voto

BlackShift Points 588

J'ai eu un problème similaire, je l'ai résolu comme ceci:

 #include <string.h>
extern void foo(char* m);

int main() {
    // warning: deprecated conversion from string constant to ‘char*'
    //foo("Hello");

    // no more warning
    char msg[] = "Hello";
    foo(msg);
}
 

Est-ce une manière appropriée de résoudre cela? Je n'ai pas accès à foo pour l'adapter à accepter 'const char *', bien que ce soit une meilleure solution (parce que foo ne change pas m).

68voto

Rob Walker Points 25840

Découvrez de gcc Diagnostic Pragma soutien, et la liste d' -W avertissement options (changé: nouveau lien pour options d'alerte). Regarde comme gcc n'a pas d'équivalent pour VC++#pragma warning(désactiver:NNNN) de support qui est très utile pour les cas de ce genre.

33voto

Konrad Rudolph Points 231505

Si c'est un actif de la base de code, vous pouvez toujours mettre à niveau la base de code. Bien entendu, les modifications manuellement n'est pas faisable, mais je crois que ce problème pourrait être résolu une fois pour toutes par un seul sed commande. Je n'ai pas essayé, même si, pour prendre avec un grain de sel.

find . -exec sed -E -i .backup -n \
    -e 's/char\s*\*\s*(\w+)\s*= "/char const* \1 = "/g' {} \;

Cela pourrait ne pas trouver tous les lieux (même pas compte tenu des appels de fonction), mais il permettrait de résoudre le problème et de le rendre possible pour effectuer les quelques modifications manuellement.

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