C++ устаревшее преобразование из Строковой константы в ' char*'


у меня есть класс с помощью private char str[256];

и для этого у меня есть явный конструктор:

explicit myClass(const char *func)
{
    strcpy(str,func);
}

Я называю это так:

myClass obj("example");

когда я компилирую это я получаю следующее предупреждение:

устаревшее преобразование из Строковой константы в ' char*'

почему это происходит?

9 110

9 ответов:

это сообщение об ошибке вы видите всякий раз, когда у вас есть ситуация, как показано ниже:

char* pointer_to_nonconst = "string literal";

почему? Ну, C и C++ отличаются типом строкового литерала. В C тип массива char и в C++ это постоянный массив char. В любом случае, вам не разрешено изменять символы строкового литерала, поэтому const в C++ на самом деле не является ограничением, а скорее вопросом безопасности типа. Преобразование из const char* to char* как правило, не представляется возможным без явного приведения по соображениям безопасности. Но для обратной совместимости с C язык C++ по-прежнему позволяет присваивать строковый литерал a char* и дает вам предупреждение о том, что это преобразование устарело.

Итак, somwehere вам не хватает одного или нескольких consts в вашей программе для корректности const. Но код, который вы показали нам, не является проблемой, поскольку он не делает такого рода устаревшего преобразования. Предупреждение, должно быть, пришло из другого места.

предупреждение:

устаревшее преобразование из Строковой константы в ' char*'

дается, потому что вы делаете где-то (не в коде, который вы опубликовали) что-то вроде:

void foo(char* str);
foo("hello");

проблема в том, что вы пытаетесь преобразовать строковый литерал (типа const char[]) в char*.

вы можете преобразовать const char[] to const 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';
}