Устаревшее преобразование из строкового литерала в '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.