Как был обсужден в нескольких недавних вопросах, объявив const
- квалифицированные переменные в C (в противоположность const
переменные в C++ или указатели на const
в C) обычно служит очень небольшой цели. Самое главное они не могут использоваться в константных выражениях.
После этих слов что является некоторым законным использованием const
квалифицированные переменные в C? Я могу думать о некоторых, которые недавно подошли в коде, с которым я работал, но конечно должны быть другие. Вот мой список:
Используя их адреса, поскольку специальная сигнальная метка оценивает за указатель, чтобы никогда не выдерживать сравнение равный любому другому указателю. Например: char *sentinel(void) { static const char s; return &s; }
или просто const char sentinel[1];
Так как мы только заботимся об адресе, и на самом деле не имело бы значения, если бы объект был записан в, единственное преимущество const
это, компиляторы будут обычно хранить его в постоянной памяти, которой это поддерживается mmap
из исполняемого файла или копии нулевой страницы.
Используя const
квалифицированные переменные для экспорта значений из библиотеки (особенно совместно использованные библиотеки), когда значения могли измениться с новыми версиями библиотеки. В таких случаях, просто с помощью #define
в интерфейсном заголовке библиотеки не был бы хороший подход, потому что он сделает зависящее от приложения на значениях констант в конкретной версии библиотеки, с которой он был создан.
Тесно связанный с предыдущим использованием, иногда Вы хотите выставить предопределенные объекты от библиотеки до приложения (наиболее существенное пример быть stdin
, stdout
, и stderr
из стандартной библиотеки). Используя тот пример, extern FILE __stdin; #define stdin (&__stdin)
была бы очень плохая реализация из-за пути большая часть системной реализации совместно использованные библиотеки - обычно они требуют всего объекта (здесь, FILE
) быть скопированным в адрес определило, когда приложение связано, и представьте зависимость от размера объекта (программа повредится, если библиотека будет восстановлена и размер объектных изменений). Используя a const
указатель (не pointer-to-const
) здесь решает все проблемы: extern FILE *const stdin;
, где const
указатель инициализируется для указания на предопределенный объект (который сам, вероятно, объявляется static
) где-нибудь внутренний к библиотеке.
Справочные таблицы для математических функций, символьных свойств, и т.д. Это - очевидное, которое я первоначально забыл включать, вероятно, потому что я думал о человеке const
переменные арифметики/типа указателя, как это - то, где тема вопроса сначала подошла. Благодаря Aidan для инициирования меня для запоминания.
Как вариант на справочных таблицах, реализации конечных автоматов. Aidan обеспечил подробный пример как ответ. Я нашел, что то же понятие также часто очень полезно без любых указателей функции, если можно закодировать поведение/переходы от каждого состояния с точки зрения нескольких числовых параметров.
У кого-либо еще есть некоторые умные, практические применения для const
- квалифицированные переменные в C?