Устаревшее преобразование из строкового литерала в 'char *'
У меня есть программа, которая объявляет массив таких строк:
char *colors[4] = {"red", "orange", "yellow", "blue"};
Но я получаю вышеупомянутое предупреждение компилятора. Он компилируется, но я предпочитаю использовать устаревший способ (если он есть). Я попытался выяснить, что это значит, но я не могу понять это. Я слышал использование 'const' до 'char', но было бы полезно, если бы кто-нибудь мог объяснить, что означает ошибка. Спасибо.
Ответы
Ответ 1
Строки, которые вы вводите: "красный", "organge" и т.д. являются "буквальными", потому что они определены внутри самого кода программы (они не читаются непосредственно с диска, пользовательского ввода /stdin и т.д.).
Это означает, что если вы в любой момент попытаетесь написать свой colors
, вы получите прямой доступ к исходному входу и, таким образом, его редактируете. Это может привести к некоторым нежелательным ошибкам во время выполнения.
Объявляя его как const, убедитесь, что вы никогда не попытаетесь записать этот указатель, и такую ошибку времени выполнения можно избежать.
const char *colors[4] = {"red", "orange", "yellow", "blue"};
Если вам когда-либо захотелось редактировать эти значения во время выполнения, сначала нужно скопировать строки.
Ответ 2
"red", "orange", "yellow", "blue"
это постоянная строка. Создание неконстантного указателя на константную строку неверно, поэтому предупреждение. На данный момент вы получаете предупреждение, но оно должно быть ошибкой, поскольку оно устарело в С++ 03 и запрещено в С++ 11.
Ответ 3
Эти ответы правильны.
Обратите внимание, что если у вас есть функция, требующая массив символов в качестве аргумента, и вы передаете этот аргумент следующим образом:
foo ("bar");
будет показано одно и то же предупреждение. В этом случае вы можете:
1) Измените его так, как описано в первом ответе:
void foo (char[] str) { printf(str); }
const char param[] = "bar";
foo (param);
2) Рассмотрим стандартную строку С++, например:
void foo (std::string theParam) { std::cout << theParam; }
foo ("bar");
IMHO, если не проблема с реальной производительностью, и вы не работаете с библиотеками C, или если вы создаете библиотеку С++ для других пользователей, вам лучше работать с неизменяемыми строками С++ и их набором функций.
Если требуется использовать Unicode, поддержка на С++ "ужасна", как описано здесь.
Этот вопрос дает вам некоторые подсказки (в основном: использование библиотеки IBM ICU). Если у вас уже есть Qt в вашем проекте, QString
также выполнит трюк, а также Gettext.