Устаревшее преобразование из строкового литерала в 'char *' - PullRequest
54 голосов
/ 11 марта 2012

У меня есть программа, которая объявляет массив строк следующим образом:

char *colors[4] = {"red", "orange", "yellow", "blue"};

Но я получаю вышеупомянутое предупреждение компилятора. Он компилируется, но я бы предпочел использовать не устаревший способ (если он есть). Я пытался выяснить, что это значит, но я не могу понять это. Я слышал об использовании const до того, как сработает char, но было бы полезно, если бы кто-то мог объяснить, что означает ошибка. Спасибо.

Ответы [ 3 ]

75 голосов
/ 11 марта 2012

Введенные вами строки: "red", "organge" и т. Д. Являются "буквальными", поскольку они определены внутри самого кода программы (они не считываются непосредственно с диска, ввода пользователя / ввода и т. *

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

Объявление его как const гарантирует, что вы никогда не будете пытаться писать в этот указатель, и такой ошибки во время выполнения можно избежать.

const char *colors[4] = {"red", "orange", "yellow", "blue"};

Если вам когда-нибудь захочется отредактировать эти значения во время выполнения, вам следует сначала скопировать строки.

10 голосов
/ 11 марта 2012
"red", "orange", "yellow", "blue"

это постоянная строка.Создание неконстантного указателя на постоянную строку неверно, отсюда и предупреждение.В настоящий момент вы получаете предупреждение, но это должно быть ошибкой, поскольку оно устарело в c ++ 03 и запрещено в c ++ 11.

4 голосов
/ 08 июля 2014

Все эти ответы верны.

Обратите внимание, что если у вас есть функция, требующая в качестве аргумента массив символов, и вы передаете этот аргумент следующим образом:

foo ("bar");

то же предупреждениебудет показано.В этом случае вы можете либо:

1) изменить его следующим образом, как описано в первом ответе:

void foo (char[] str) { printf(str); }

const char param[] = "bar";
foo (param);

2) рассмотреть возможность использования стандартной строки C ++, например:

void foo (std::string theParam) { std::cout << theParam; }

foo ("bar");

ИМХО, если реальная проблема с производительностью не затрагивается, и вы не работаете с библиотеками C или если вы создаете библиотеку C ++ для других пользователей, вам лучше работать с неизменяемыми строками C ++ иих набор функций.

Если требуется Unicode, поддержка в C ++ "ужасна", как объяснено здесь . Этот вопрос дает вам некоторые подсказки (в основном: используйте библиотеку IBM ICU).Если у вас уже есть Qt в вашем проекте, QString также сделает то же самое, и Gettext.

...