Глава 4. Препроцессор____________________________________99_

Замена символических констант # define на const

Препроцессирование — это не то же самое, что компиляция. Оставшиеся константы в стиле С должны быть изжиты. Препроцессор не проверяет совместимость типов между символическими именами вроде

#define MAX 10

и контекстом, в котором они используются. Следовательно, если МАХ используется в контексте, в котором она не имеет смысла, это будет довольно трудно обнаружить. Константы этого типа должны быть заменены определениями через ключевое слово const, которое превратит предыдущий оператор в

const int MAX =10; .,

Такое определение обрабатывается непосредственно компилятором, а соответствие константы контексту будет им проверено и при необходимости вам будет выдано сообщение об ошибке.

Совет

Существует один случай, в котором другие методы, помимо использования препроцессора, неприемлемы. Это случай старого определения NULL. В стиле С его можно было определить как

#define NULL О

однако использование ftdefine для создания константы не одобряется новой парадигмой. Можно было бы применить const, но это не так просто. Простое определение const NULL некоторого конкретного типа не подходит, так как присваивание такого нуля элементу другого типа приведет к ошибке компиляции. Например, определение NULL как

const int NULL = 0;

не позволит скомпилировать присваивание его данным определенных пользователем типов. Определение нескольких нулей разного типа неудобно и заставляет помнить слишком много имен. Решение в том, чтобы просто использовать 0, когда нужен NULL, для всех типов данных. Это единственный вариант, который работает корректно и надежно в любом контексте.

Встраиваемые функции вместо макросов

Дожившие до наших дней еще со времен ассемблера макроопределения в стиле С заменены компиляторным эквивалентом, который более надежен, перегружаем и, наконец, делает то же самое.

Существует мнение, что Бриан Керниган и Дэннис Ритчи придумали С, потому что им не хотелось писать программы на ассемблере; в таком случае