При рассмотрении моего кода здесьconst
возникла проблема использования ключевого слова. Я понимаю, что он используется для реализации поведения переменных только для чтения.
Я не понимаю, какие существуют ситуации, когда это может быть полезно.
- Должно ли оно использоваться для ясности в прототипах функций?
- Должно ли оно использоваться в качестве меры безопасности при разработке кода?
- Должно ли оно использоваться в рамках различных функций для объявления констант во время выполнения?
- Должен ли он использоваться вообще?
Эти вопросы являются лишь примерами путаницы, с которой я сталкиваюсь. Общая путаница
- Когда следует использовать
const
ключевое слово в программировании на C? - Каковы различные типы преимуществ, которые могут быть получены с помощью этого ключевого слова в C?
- Есть ли минусы использования
const
ключевого слова?
Было отмечено, что этот вопрос может быть слишком широким из-за всех этих вопросов в деталях моего вопроса. Я просто хотел уточнить, что эти вопросы просто чтобы прояснить путаницу в отношении основного вопроса.
Когда и для каких целей в C следует использовать ключевое слово const для переменных?
Это также можно перефразировать как
Правильное использование
const
ключевого слова в C` с плюсами и минусами одинаково.
c
readability
patterns-and-practices
const
Aseem Bansal
источник
источник
Specific issues with software development
. Я весьма конкретен.specific issue
. Правильное использованиеconst
ключевого слова в C` с плюсами и минусами одинаково.Ответы:
При просмотре кода я применяю следующие правила:
Всегда используйте
const
для параметров функции, передаваемых по ссылке, когда функция не изменяет (или не освобождает) указанные данные.Всегда используйте
const
константы, которые в противном случае могут быть определены с помощью #define или enum. В результате компилятор может размещать данные в постоянном запоминающем устройстве (ПЗУ) (хотя компоновщик часто является лучшим инструментом для этой цели во встроенных системах).Никогда не используйте const в прототипе функции для параметра, переданного по значению . Это не имеет смысла и, следовательно, просто «шум».
При необходимости используйте
const volatile
в местах, которые не могут быть изменены программой, но могут измениться. Аппаратные регистры являются типичным случаем использования, например, регистр состояния, который отражает состояние устройства:Другое использование не является обязательным. Например, параметры функции в реализации функции могут быть помечены как const.
или функция возвращает значения или вычисления, которые получены и затем никогда не изменяются:
Это использование
const
просто указывает, что вы не будете изменять переменную; они не меняют то, как и где хранится переменная. Разумеется, компилятор может определить, что переменная не изменилась, но, добавив,const
вы позволите этому принудительно применить это. Это может помочь читателю и добавить некоторую безопасность (хотя, если ваши функции большие или достаточно сложные, что это имеет большое значение, у вас, возможно, есть другие проблемы). Редактировать - например плотно закодированная функция из 200 строк с вложенными циклами и множеством длинных или похожих имен переменных, зная, что некоторые переменные никогда не меняются, может значительно облегчить понимание. Такие функции были плохо разработаны или поддерживаются.Проблемы с
const
. Вы, вероятно, услышите термин «отравление константой». Это происходит, когда добавлениеconst
к параметру функции вызывает распространение «constness».Редактировать - постоянное отравление: например, в функции:
если мы изменим
str
наconst
, мы должны затем убедиться, чтоfuction_b
также принимаетconst
. И так далее , еслиfunction_b
проходитstr
наfunction_c
, и т.д. Как вы можете себе представить , что это может быть болезненным , если она распространяется на множество отдельных файлов / модулей. Если он распространяется в функцию, которую нельзя изменить (например, в системную библиотеку), тогда приведение становится необходимым. Таким образом, разбрасываниеconst
в существующем коде, возможно, вызывает проблемы. В новом коде, однако, лучше всегоconst
квалифицироваться последовательно, где это уместно.Более коварная проблема в
const
том, что это не на языке оригинала. Как дополнение это не совсем подходит. Для начала у этого есть два значения (как в правилах выше, означающих "я не собираюсь изменять это" и "это не может быть изменено"). Но более того, это может быть опасно. Например, скомпилируйте и запустите этот код и (в зависимости от компилятора / опций) он может привести к сбою при запуске:strchr
возвращаетchar*
неconst char*
. Поскольку его параметр вызова -const
это, он должен привести параметр вызова кchar*
. И в этом случае это отбрасывает реальное свойство хранения только для чтения. Изменить: - это обычно относится к переменным в памяти только для чтения. Под «ПЗУ» я имею в виду не только физическое ПЗУ, но и любую память, защищенную от записи, как это происходит с разделом кода программ, работающих на типичной ОС.Многие стандартные библиотечные функции ведут себя одинаково, поэтому будьте осторожны: когда у вас есть реальные константы (т.е. хранятся в ПЗУ), вы должны быть очень осторожны, чтобы не потерять их константу.
источник
const volatile
переменную.const
переменная действительно доступна только для чтения:const
говорит : «Это нельзя изменить». Аconst volatile
с другой стороны говорит: «Это нельзя изменить, но это может измениться». Я добавлю упоминание летучих веществ в мой ответ.const
переменную безconst
указателя» (распространенный вопрос на SO и любом другом форуме C). !). В целом, мне нравится этот ответ, хотя :)const
объявляет оба чтения только данные и только для чтения вид из-данных с разницей, «это не может быть изменен» против « вы не можете изменить это».Обычно на любом языке программирования рекомендуется использовать
const
или эквивалентный модификатор, так какисточник
Да, это в основном ответ TheLQ.
Это мера безопасности для программиста, поэтому вы не изменяете переменную и не вызываете функции, которые могут их изменить. В массиве или структуре спецификатор const указывает, что значения их содержимого не будут изменены, и даже компилятор не позволит вам сделать это. Тем не менее, вы все равно можете легко изменить значение переменной с помощью только приведения.
В том, что я обычно вижу, он в основном используется для добавления константных значений в код и для указания того, что массив или структура не будут изменены, если вы вызовете определенную функцию. Эта последняя часть важна, потому что когда вы вызываете функцию, которая БУДЕТ изменить ваш массив или структуру, вы можете захотеть сохранить исходную версию, поэтому вы создаете копию переменной и затем передаете ее функции. Если это не так, вам не нужна копия, очевидно, поэтому, например, вы можете изменить,
в
и не получая копию накладных расходов.
Просто добавим, обратите внимание, что в C есть особые правила со спецификатором const. Например,
это не то же самое, что
Первый код не позволит вам изменить. Во втором случае указатель является константой, а его содержимое - нет, поэтому компилятор позволит вам сказать
* a = 3;
без ошибки компилятора, но вы не можете сделатьa
ссылку на другое.источник
В соответствии с заявлениями TheLQ:
При работе с командой программистов декларация
const
является хорошим способом указать, что указанная переменная не должна изменяться или просто напоминать о себе в больших проектах. Это полезно в этом смысле и может спасти многие головные боли.источник