Mail.ruПочта0Мой Мир0ОдноклассникиВКонтактеИгры0ЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как на Си объявить константу, не используя директиву define?

Алексей Алексаев Профи (552), закрыт 14 лет назад
Лучший ответ
Вероятно, справа - ты Оракул (69119) 14 лет назад
const типКонстанты ИМЯКОНСТАНТЫ значение

К примеру, если создать строковую константу
const string HELLO "Привет";
или так
#define HELLO "Привет";
именем константы можно пользоваться в коде вместо строки "Привет".
Но следует помнить, что первый способ даёт возможность проверки типа, и константу HELLO можно будет использовать только там, где можно использовать обычные строки. Однако второй способ не имеет подобных ограничений, и это может привести к странным результатам:
int x = HELLO
Для константы, определённой посредством сonst, возникнет ошибка в процессе компиляции, но это не произойдёт для #define
И это не даст возможности компилятору самому найти эту ошибку, в этом преимущество у директивы const.
Источник: Хенкеманс, Ли, Программирование на cpp, стр 54, Применение констант
Остальные ответы
matod Искусственный Интеллект (192908) 14 лет назад
Строго говоря, с помощью директивы вы не можете объявить константу. define определяет макроподстановку (макрозамену) . И имя, используемое в этой команде называется именем макроса.
Константу определяют с помощью ключевого слова const.

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

Макроподстановка - это просто сокращенное обозначение некоего набора символов. Компилятор выполнит замену имени на эту последовательность до процесса преобразования исходного текста в объектный код. Поскольку никакой типизации макросов нет по определению, нет и никакого (ну, почти никакого) контроля, что может привести ко всяким неприятностям.

Бездумное использование макро может привести к нерациональному использованию памяти, трудно воспринимаемому коду и "хитрым" ошибкам, выявление которых требует неоправдано много времени.
Похожие вопросы