Je travaille donc sur une base de code extrêmement grande et récemment mise à niveau vers gcc 4.3, ce qui déclenche maintenant cet avertissement:
avertissement: conversion obsolète de la constante de chaîne en '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 appel de fonction comme:
void foo(char *s);
foo("constant string");
et en faire des const char
pointeurs. Cependant, cela signifierait toucher 564 fichiers, au minimum, ce qui n'est pas une tâche que je souhaite effectuer à ce stade. Le problème en ce moment est que je cours avec -werror
, j'ai donc besoin d'un moyen d'étouffer ces avertissements. Comment puis je faire ça?
Réponses:
Je crois que passer
-Wno-write-strings
à gcc supprimera cet avertissement.la source
#pragma GCC diagnostic ignored "-Wwrite-strings"
.Toutes les fonctions dans lesquelles vous passez des littéraux de chaîne
"I am a string literal"
doivent utiliserchar const *
comme type au lieu dechar*
.Si vous voulez réparer quelque chose, corrigez-le correctement.
Explication:
Vous ne pouvez pas utiliser de littéraux de chaîne pour initialiser des chaînes qui seront modifiées, car elles sont de type
const char*
. A bas les constness pour modifier plus tard eux est un comportement non défini , vous devez copier vosconst char*
chaîneschar
parchar
en alloués dynamiquement deschar*
chaînes afin de les modifier.Exemple:
la source
char *
/const char *
, donc dans ce cas, je casse normalement.char*
même pour les chaînes qui ne seront pas modifiées. Si vous prenez un paramètre en tant quechar const*
et le passez à une fonction standard en prenant un,char*
vous l'atteindrez. Si la fonction de bibliothèque ne manipule pas la chaîne, vous pouvez supprimer leconst
.J'ai eu un problème similaire, je l'ai résolu comme ceci:
Est-ce une façon appropriée de résoudre ce problème? Je n'ai pas accès à
foo
adapter pour l'accepterconst char*
, même si ce serait une meilleure solution (carfoo
ça ne change pasm
).la source
char **
dansPyArg_ParseTupleAndKeywords
je fais quelque chose comme ceci:static char kw[][16] = {"mode", "name", "ip", "port"}; static char * kwlist[] = {kw[0], kw[1], kw[2], kw[3], NULL};
Consultez le support Diagnostic Pragma de gcc et la liste des options d'avertissement -W (modifié: nouveau lien vers les options d'avertissement ).
Pour gcc, vous pouvez utiliser des
#pragma warning
directives comme expliqué ici .la source
S'il s'agit d'une base de code active, vous souhaiterez peut-être toujours mettre à niveau la base de code. Bien sûr, effectuer les modifications manuellement n'est pas possible mais je pense que ce problème pourrait être résolu une fois pour toutes par une seule
sed
commande. Je ne l'ai pas encore essayé, alors prenez ce qui suit avec un grain de sel.Cela pourrait ne pas trouver tous les emplacements (même en ne tenant pas compte des appels de fonction), mais cela atténuerait le problème et permettrait d'effectuer les quelques modifications restantes manuellement.
la source
Je ne peux pas utiliser le commutateur du compilateur. J'ai donc tourné ceci:
pour ça:
la source
Voici comment le faire en ligne dans un fichier, vous n'avez donc pas à modifier votre Makefile.
Vous pourrez alors plus tard ...
la source
Remplacer
avec
ou si vous appelez en fonction:
remplacer cela par
la source
Au lieu de:
Cela marche:
la source
En C ++, utilisez le
const_cast
comme ci-dessousla source
Test string
est une chaîne de const. Vous pouvez donc résoudre comme ceci:ou:
la source
Pourquoi ne pas simplement utiliser la conversion de type?
la source
Faire un transtypage de type chaîne constante vers un pointeur char
la source
En C ++, remplacez:
avec:
Et si vous voulez le comparer:
la source
En travaillant avec Arduino Sketch, j'avais une fonction à l'origine de mes avertissements.
Pour arrêter les avertissements, j'ai ajouté le const devant le char * str et le char * sfind.
Tous les avertissements ont disparu.
la source
voir cette situation:
regardez le champ du nom, dans gcc il compile sans avertissement, mais dans g ++ il le fera, je ne sais pas pourquoi.
la source
Vous pouvez également créer une chaîne inscriptible à partir d'une constante de chaîne en appelant
strdup()
.Par exemple, ce code génère un avertissement:
Cependant, le code suivant ne fonctionne pas (il fait une copie de la chaîne sur le tas avant de la transmettre
putenv
):Dans ce cas (et peut-être dans la plupart des autres), désactiver l'avertissement est une mauvaise idée - c'est là pour une raison. L'autre alternative (rendre toutes les chaînes accessibles en écriture par défaut) est potentiellement inefficace.
Écoutez ce que le compilateur vous dit!
la source
putenv()
est lourd - ce n'est pas un bon choix d'exemple (du moins, pas sans beaucoup plus de discussions sur ce quiputenv()
fait qu'il n'y en a dans cette réponse). C'est une discussion complètement séparée. (Notez que la spécification POSIX pour le comportement deputenv()
est problématique, basée sur les implémentations héritées d'avant la définition de POSIX.) IIRC, il y avait un bogue dans une version récente (ce millénaire) de la bibliothèque GNU C qui était liée auputenv()
changement de comportement, et être changé en arrière.)utilisez simplement l'option -w pour g ++
exemple:
g ++ -w -o simple.o simple.cpp -lpthread
Rappelez-vous que cela n'évite pas la dépréciation, mais empêche d'afficher un message d'avertissement sur le terminal.
Maintenant, si vous voulez vraiment éviter la dépréciation, utilisez le mot-clé const comme ceci:
la source
Pourquoi n'utilisez-vous pas l'
-Wno-deprecated
option pour ignorer les messages d'avertissement obsolètes?la source
C'est votre vrai problème, OMI. Vous pouvez essayer des moyens automatisés de passer de (char *) à (const char *) mais je mettrais de l'argent dessus non seulement en travaillant. Vous devrez impliquer un humain pour au moins une partie du travail. Pour le court terme, ignorez simplement l'avertissement (mais IMO laissez-le allumé, sinon il ne sera jamais corrigé) et supprimez simplement -Werror.
la source
Merci à tous pour l'aide. Choisir ici et là vient cette solution. Cela compile propre. Je n'ai pas encore testé le code. Demain peut-être...
Je sais, il n'y a qu'un seul élément dans le tableau timeServer. Mais il pourrait y en avoir plus. Le reste a été commenté pour l'instant pour économiser de la mémoire.
la source
regardez le champ du nom, dans gcc il compile sans avertissement, mais dans g ++ il le fera, je ne sais pas pourquoi.
dans
gcc (Compiling C)
, -Wno-write-strings est actif par défaut.dans
g++ (Compiling C++)
-Wwrite-strings est actif par défautC'est pourquoi il y a un comportement différent. Pour nous, l'utilisation de macros de
Boost_python
génère de tels avertissements. Nous utilisons donc-Wno-write-strings
lors de la compilation C ++ puisque nous utilisons toujours-Werror
la source
Déclarez une chaîne comme
const
résoudra le problème:la source