Enumerations
Enum.1
Предпочитайте перечисления макросам
Причина
Макросы не подчиняются правилам области видимости и типизации. Кроме того, имена макросов удаляются на этапе препроцессинга и обычно не видны в инструментах вроде отладчиков.
Пример
Сначала — плохой старый код:
// webcolors.h (сторонний заголовочный файл)
#define RED 0xFF0000
#define GREEN 0x00FF00
#define BLUE 0x0000FF
// productinfo.h
// Следующие макросы определяют подтипы продукта на основе цвета
#define RED 0
#define PURPLE 1
#define BLUE 2
int webby = BLUE; // webby == 2; скорее всего, не то, что имелось в виду
Вместо этого используйте enum:
enum class Web_color { red = 0xFF0000, green = 0x00FF00, blue = 0x0000FF };
enum class Product_info { red = 0, purple = 1, blue = 2 };
int webby = blue; // ошибка: нужно быть конкретным
Web_color webby = Web_color::blue;
Мы используем enum class, чтобы избежать конфликтов имён.
Примечание
Рассмотрите также переменные constexpr и const inline.
Контроль
Отмечать макросы, определяющие целочисленные значения. Использовать enum, const inline или другую альтернативу вместо макроса.