C++ устаревшее преобразование из Строковой константы в ' char*'
у меня есть класс с помощью private char str[256];
и для этого у меня есть явный конструктор:
explicit myClass(const char *func)
{
strcpy(str,func);
}
Я называю это так:
myClass obj("example");
когда я компилирую это, я получаю следующее предупреждение:
устаревшее преобразование из Строковой константы в'char*'
почему это происходит?
9 ответов
это сообщение об ошибке вы видите, когда у вас есть ситуации, как следующие:
char* pointer_to_nonconst = "string literal";
почему? Ну, C и C++ отличаются типом строкового литерала. В C типом является массив char, а в C++ -постоянный массив char. В любом случае, вам не разрешено изменять символы строкового литерала, поэтому const в C++ на самом деле не является ограничением, а скорее безопасностью типа. Преобразование из const char*
to char*
вообще не возможно без явного гипса по соображениям безопасности. Но для обратной совместимости с C язык C++ по-прежнему позволяет присваивать строковый литерал char*
и дает вам предупреждение о том, что это преобразование устарело.
Итак, somwehere вам не хватает одного или нескольких const
s в вашей программе для корректности const. Но код, который вы показали нам, не является проблемой, поскольку он не выполняет такого рода устаревшее преобразование. Предупреждение, должно быть, пришло откуда-то из другого места.
предупреждение:
устаревшее преобразование из Строковой константы в'char*'
дается, потому что вы делаете где-то (не в коде, который вы разместили) что-то вроде:
void foo(char* str);
foo("hello");
проблема в том, что вы пытаетесь преобразовать строковый литерал (типа const char[]
) в char*
.
вы можете преобразовать const char[]
to const char*
потому что массив распадается на указатель, но то, что вы делаете делает изменяемым в постоянный.
это преобразование, вероятно, разрешено для совместимости C и просто дает вам упомянутое предупреждение.
As ответ нет. 2 by fnieto-Fernando Nieto четко и правильно описывает, что это предупреждение дается, потому что где-то в вашем коде вы делаете (не в коде, который вы разместили) что-то вроде:
void foo(char* str);
foo("hello");
однако, если вы хотите сохранить свой код без предупреждения, а затем просто внести соответствующие изменения в свой код:
void foo(char* str);
foo((char *)"hello");
то есть, просто бросить string
постоянная (char *)
.
есть 3 решения:
Решение 1:
const char *x = "foo bar";
решение 2:
char *x = (char *)"foo bar";
решение 3:
char* x = (char*) malloc(strlen("foo bar")+1); // +1 for the terminator
strcpy(x,"foo bar");
массивы также могут использоваться вместо указателей, потому что массив уже является постоянным указателем.
фактически строковый постоянный литерал не является ни const char * , ни char*, но char[]. Это довольно странно, но записано в спецификациях c++; если вы измените его, поведение не определено, потому что компилятор может хранить его в сегменте кода.
Я решаю эту проблему, добавляя этот макрос в начале кода, где-то. Или добавьте его в <iostream>
, хе-хе.
#define C_TEXT( text ) ((char*)std::string( text ).c_str())
У меня тоже такая же проблема. И я просто добавил const char*вместо char*. И проблема решена. Как уже упоминалось выше, это совместимо ошибка. C рассматривает строки как массивы символов, а c++ - как массивы символов const.
для чего это стоит, я нахожу этот простой класс-оболочку полезным для преобразования строк C++ в char *
:
class StringWrapper {
std::vector<char> vec;
public:
StringWrapper(const std::string &str) : vec(str.begin(), str.end()) {
}
char *getChars() {
return &vec[0];
}
};
следующее иллюстрирует решение, назначьте строку переменная указатель на константу-массив char (строка постоянный указатель на постоянный массив информации о длине char - plus):
#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';
}