Каковы некоторые практические применения для квалифицированных к константе переменных в C?

Как был обсужден в нескольких недавних вопросах, объявив 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?

5
задан 2 revs 8 August 2010 в 14:35
поделиться