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*
tochar*
как правило, не представляется возможным без явного приведения по соображениям безопасности. Но для обратной совместимости с C язык C++ по-прежнему позволяет присваивать строковый литерал achar*
и дает вам предупреждение о том, что это преобразование устарело.Итак, somwehere вам не хватает одного или нескольких
const
s в вашей программе для корректности const. Но код, который вы показали нам, не является проблемой, поскольку он не делает такого рода устаревшего преобразования. Предупреждение, должно быть, пришло из другого места.
предупреждение:
устаревшее преобразование из Строковой константы в ' char*'
дается, потому что вы делаете где-то (не в коде, который вы опубликовали) что-то вроде:
void foo(char* str); foo("hello");
проблема в том, что вы пытаетесь преобразовать строковый литерал (типа
const char[]
) вchar*
.вы можете преобразовать
const char[]
toconst char*
потому что массив распадается на указатель, но то, что вы делаете делает изменяемым в постоянный.это преобразование, вероятно, разрешено для совместимости C и просто дает вам упомянутое предупреждение.
как ответ № 2 от 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'; }