Прекращение преобразования C ++ из строковой константы в 'char *' - PullRequest
133 голосов
/ 06 октября 2009

У меня есть класс с private char str[256];

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

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

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

myClass obj("example");

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

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

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

Ответы [ 10 ]

142 голосов
/ 07 октября 2009

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

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

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

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

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

Вы можете преобразовать const char[] в const char*, потому что массив распадается на указатель, но то, что вы делаете, делает изменяемым константу.

Это преобразование, вероятно, разрешено для совместимости с C и просто выдает упомянутое предупреждение.

124 голосов
/ 06 октября 2009

Это сообщение об ошибке, которое появляется при возникновении ситуации, подобной следующей:

char* pointer_to_nonconst = "string literal";

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

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

83 голосов
/ 21 декабря 2010

Как ответ №.2 by fnieto - Фернандо Ньето четко и правильно описывает, что это предупреждение выдается, потому что где-то в вашем коде вы делаете (не в коде, который вы опубликовали) что-то вроде:

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

Однако, если выхотите, чтобы ваш код не содержал предупреждений, а затем просто внесите соответствующие изменения в свой код:

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

То есть просто приведите константу string к (char *).

32 голосов
/ 10 июля 2014

Есть 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");

Массивы также можно использовать вместо указателей, поскольку массив уже является постоянным указателем.

3 голосов
/ 06 октября 2009

На самом деле строковый константный литерал не является ни const char *, ни char *, а char []. Это довольно странно, но записано в спецификациях c ++; Если вы измените его, поведение не определено, потому что компилятор может сохранить его в сегменте кода.

1 голос
/ 20 ноября 2018

Может быть, вы можете попробовать это:

void foo(const char* str) 
{
    // Do something
}

foo("Hello")

у меня работает

1 голос
/ 15 сентября 2011

Я решаю эту проблему, добавляя этот макрос в начало кода, где-нибудь. Или добавьте его в <iostream>, хе-хе.

 #define C_TEXT( text ) ((char*)std::string( text ).c_str())
0 голосов
/ 26 февраля 2018

Я считаю, что этот простой класс-обертка полезен для преобразования строк C ++ в char *:

class StringWrapper {
    std::vector<char> vec;
public:
    StringWrapper(const std::string &str) : vec(str.begin(), str.end()) {
    }

    char *getChars() {
        return &vec[0];
    }
};
0 голосов
/ 12 октября 2015

У меня тоже такая же проблема. Я просто добавил const char * вместо char *. И проблема решена. Как уже упоминалось выше, это совместимая ошибка. C рассматривает строки как массивы символов, а C ++ - как массивы const.

0 голосов
/ 16 сентября 2011

Следующее иллюстрирует решение, назначьте вашу строку для переменной указатель на константный массив char (строка является константой указатель на постоянный массив char - плюс длина Информация):

#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';
}
...