2015-09-03 1 views
1

J'ai ces deux lignes dans mon code:avertissement Désactiver "conversion dépréciée de constante chaîne 'char *' [-Wwrite-strings]"

RFM2G_STATUS result; 
result = RFM2gOpen("\\\\.\\rfm2g1", &rH); 

Je reçois le message d'erreur:

"warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings] 
    result = RFM2gOpen("\\\\.\\rfm2g1", &rH);" 

en fait, je ne peux pas le modifier pour

const RFM2G_STATUS result; 

parce RFM2G_STATUS est prédéfini dans un autre fichier et n'accepte pas const avant. Existe-t-il un autre moyen de désactiver ce message d'avertissement?

+1

Veuillez indiquer la signature de 'RFM2gOpen()'. –

+0

c'est la définition de cette fonction dans l'autre fichier STDRFM2GCALL RFM2gOpen (char * DevicePath, RFM2GHANDLE * rh); –

+0

En supposant gcc alors voir [Comment se débarrasser de 'conversion obsolète de chaîne de caractères constante à 'char *' avertissements dans GCC?] (Http://stackoverflow.com/q/59670/1708801) –

Répondre

1

Vous semblez être absolument sûr que RFM2gOpen ne modifie pas la chaîne d'entrée, sinon vous auriez un comportement indéfini dans votre code tel qu'il est maintenant.

Si vous êtes sûr que les données d'entrée ne seront pas écrites, vous pouvez const_cast le constness loin en toute sécurité:

result = RFM2gOpen(const_cast<char*>("\\\\.\\rfm2g1"), &rH); 

Encore une fois, ce n'est sûr que si la routine ne pas écriture à l'entrée chaîne, jamais, sinon c'est un comportement indéfini!

Si vous n'êtes pas complètement sûr que cette méthode ne sera jamais écrire sur le tableau de caractères, copiez la chaîne à un std::vector<char> et passer le pointeur .data() à la fonction (ou utiliser un simple tableau char comme Bo Persson suggests, qui serait très probablement plus efficace/approprié que le vector).

+0

merci, cela a fonctionné pour moi –

1

Une solution possible est:

RFM2gOpen(const_cast<char*>("\\.\rfm2g1"), &rH); 

Cela peut provoquer un défaut d'exécution si RFM2gOpen tente de modifier la chaîne.

Ce qui suit est moins susceptible de provoquer un défaut de mémoire, mais il comportement encore mal défini:

std::string s("\\.\rfm2g1"); 
RFM2gOpen(const_cast<char*>(s.c_str()), &rH); 

Pour être pleinement conforme vous devez copier le « \ \ rfm2g1. » À un tampon mutable. Quelque chose comme:

char *s = alloca(strlen("\\.\rfm2g1")+1); 
strcpy(s, "\\.\rfm2g1"); 
RFM2gOpen(s, &rH); 

La vraie solution, bien sûr, est pour RFM2gOpen à être mis à jour pour prendre une const char*.

0

Il semblerait que la fonction RFM2gOpen() attend un paramètre non-const char* en tant que premier (see here), car il peut parfois se produire avec (ou de l'API écrite par des codeurs paresseux) API existant, et les littéraux de chaîne sont de type const char* donc une conversion implicite obsolète se produit (se débarrasser du qualificateur de const).

Si vous êtes * 100% sûr que la fonction ne modifiera pas la pointe à la mémoire, puis etnealors peut vous mettre juste une conversion explicite, par exempleconst_cast<char*>("\\\\.\\rfm2g1") ou (style C) (const char*)"\\\\.\\rfm2g1"

2

Comme le message dit, la conversion const char*-char* (C++ qui a hérité de l'ancienne langage C qui n'a pas eu const) a été dépréciée.

Pour éviter cela, vous pouvez stocker le paramètre dans une chaîne non-const, et que passer à la fonction:

char parameter[] = "\\\\.\\rfm2g1"; 
RFM2G_STATUS result; 
result = RFM2gOpen(parameter, &rH); 

De cette façon, vous évitez les moulages laid.

+0

merci beaucoup cela fonctionne aussi avec moi –