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 вам не хватает одного или нескольких consts в вашей программе для корректности 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';
}