Устаревшее преобразование из строкового литерала в ‘char *’

У меня есть программа, которая объявляет массив таких строк:

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

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

    Строки, которые вы вводите: «красный», «organge» и т. Д., Являются «буквальными», потому что они определены внутри самого программного кода (они не считываются напрямую с диска, ввода пользователя / stdin и т. Д.).

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

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

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

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

     "red", "orange", "yellow", "blue" 

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

    Эти ответы правильны.

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

     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"); 

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

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

    Interesting Posts

    Несколько процессов chrome.exe в диспетчере задач

    Лучший способ использовать размещенный jQuery Google, но вернуться к моей размещенной библиотеке при сбое Google

    Windows 7 отказывается устанавливать из-за ошибки раздела во время установки

    Хороший бесплатный интернет-фильтр

    Как использовать ключи f-1 – f12 без нажатия клавиши FN в Windows 7 с помощью bootcamp на Macbook Pro?

    Могу ли я установить бесплатную версию Windows 7/8 -> 10 на новом пустом диске?

    Qt – удалить все виджеты из макета?

    Android: определить яркость (количество света) в окружении телефона с помощью камеры?

    Ошибка аутентификации паролей Postgres

    Может ли сильная именования сборки использоваться для проверки автора сборки?

    Как имитировать регулярные выражения в LINQ-to-SQL

    Функция PadLeft в T-SQL

    Найти все элементы на странице, чей идентификатор элемента содержит определенный текст, используя jQuery

    Разница между HBase и Hadoop / HDFS

    ASP.net MVC4 WebApi маршрут с именем файла в нем

    Давайте будем гением компьютера.