Константы в Си можно определить 2 базовыми способами
- через препроцессор: #define MYCONST ‘A’;
- через ключевое слово: const char MYCONST ‘A’.
В первом случае это будет не совсем константа в привычном понимании языка Си, а макроподстановка, которая выполнится в процессе компиляции, а во втором случае для этого используется специальное ключевое слово, которое реально указывает на то, что это есть константа. Значение константы нельзя менять за все время выполнения программы и если поменять, то будет выкинута ошибка присвоения.
Путаница связана главным образом с заблуждением о том, что #define объявляет константу. Это неверно.
define — макроподстановка, предназначенная для обработки препроцессором.
Настоящая константа в C записывается как:
const int alpha = 3; const char beta[]="beta";
Разница состоит в том, что макроподстановку препроцессор чисто механически воткнет во все места в исходном тексте, где она встречается.
В то же время, константу обрабатывает компилятор, на более высоком, «умном» уровне. Обратите внимание, что у настоящей константы есть тип — это означает, что глупая ошибка вроде «число вместо строки» просто не откомпилируется. А вот с макроподстановкой такой номер может не пройти.
Одно из важных правил — макроподстановкам нужно всегда предпочитать константы, чтобы избежать чудесных глюков.