Conversion obsolète C++ de la constante de chaîne en ' char*'
j'ai une classe avec un private char str[256];
et pour cela j'ai un constructeur explicite:
explicit myClass(const char *func)
{
strcpy(str,func);
}
Je l'appelle comme:
myClass obj("example");
lors de la compilation, j'obtiens l'avertissement suivant:
conversion dépréciée de la constante de chaîne en 'char* '
pourquoi cela se produit-il?
9 réponses
Ceci est un message d'erreur que vous voyez chaque fois que vous avez une situation comme celle-ci:
char* pointer_to_nonconst = "string literal";
pourquoi? Eh bien, C et c++ diffèrent dans le type de la chaîne literal. En C le type de tableau de char et en C++, il est constante tableau de char. Dans tous les cas, vous n'êtes pas autorisé à changer les caractères de la chaîne literal, donc le const en C++ n'est pas vraiment une restriction mais plutôt une chose de sécurité de type. Une conversion de const char*
en char*
n'est généralement pas possible sans moulage explicite pour des raisons de sécurité. Mais pour la compatibilité ascendante avec C le langage C++ permet toujours d'assigner une chaîne littérale à un char*
et vous donne un avertissement au sujet de cette conversion étant dépréciée.
ainsi, quelque part vous manquez un ou plusieurs const
dans votre programme pour l'exactitude de const. Mais le code que vous nous avez montré n'est pas le problème car il ne fait pas ce genre de conversion dépréciée. Le avertissement doivent provenir d'un autre endroit.
l'avertissement:
conversion dépréciée de la constante de chaîne en 'char* '
est donné parce que vous faites quelque part (pas dans le code que vous avez posté) quelque chose comme:
void foo(char* str);
foo("hello");
le problème est que vous essayez de convertir une chaîne littérale (avec le type const char[]
) en char*
.
vous pouvez convertir un const char[]
en const char*
parce que le tableau se décompose au pointeur, mais ce que vous faites est de faire un mutable une constante.
cette conversion est probablement permise pour la compatibilité C et vous donne juste l'avertissement mentionné.
As answer no. 2 par fnieto-Fernando Nieto décrit clairement et correctement que cet avertissement est donné parce que quelque part dans votre code vous faites (pas dans le code que vous avez posté) quelque chose comme:
void foo(char* str);
foo("hello");
cependant, si vous voulez garder votre code sans avertissement aussi bien faire le changement respectif dans votre code:
void foo(char* str);
foo((char *)"hello");
C'est-à-dire, il suffit de lancer la constante string
à (char *)
.
il y a 3 solutions:
Solution 1:
const char *x = "foo bar";
Solution 2:
char *x = (char *)"foo bar";
Solution 3:
char* x = (char*) malloc(strlen("foo bar")+1); // +1 for the terminator
strcpy(x,"foo bar");
Les tableaux peuvent aussi être utilisés à la place des pointeurs parce qu'un tableau est déjà un pointeur constant.
en fait, une constante de chaîne littérale n'est ni une const char * ni une char* mais une char[]. C'est assez étrange mais écrit dans les spécifications c++; Si vous le modifiez, le comportement n'est pas défini car le compilateur peut le stocker dans le segment de code.
Je résous ce problème en ajoutant cette macro au début du code, quelque part. Ou l'ajouter dans <iostream>
, hehe.
#define C_TEXT( text ) ((char*)std::string( text ).c_str())
j'ai aussi eu le même problème. Et ce que j'ai simplement fait, c'est ajouter const char* au lieu de char*. Et le problème résolu. Comme d'autres l'ont mentionné ci-dessus, il s'agit d'une erreur de compatibilité. C traite les chaînes comme des tableaux de char tandis que C++ les traite comme des tableaux de char de const.
pour ce que ça vaut, je trouve que cette classe de wrapper simple est utile pour convertir les chaînes C++ en char *
:
class StringWrapper {
std::vector<char> vec;
public:
StringWrapper(const std::string &str) : vec(str.begin(), str.end()) {
}
char *getChars() {
return &vec[0];
}
};
ce qui suit illustre la solution, assignez votre chaîne de caractères à un pointeur variable à un tableau constant de char (une chaîne de caractères est un pointeur constant à un tableau constant de char-plus length info):
#include <iostream>
void Swap(const char * & left, const char * & right) {
const char *const temp = left;
left = right;
right = temp;
}
int main() {
const char * x = "Hello"; // These works because you are making a variable
const char * y = "World"; // pointer to a constant string
std::cout << "x = " << x << ", y = " << y << '\n';
Swap(x, y);
std::cout << "x = " << x << ", y = " << y << '\n';
}