[P&AM Lab] Пример для разбора исходного кода - cat(1) из BSD 4.2
Grigoriy A. Sitkarev
sitkarev на komitex.ru
Чт Дек 9 23:35:50 MSK 2010
Прокомментирую.
> На самом деле рекомендуется избегать применения макросов за исключением
> ситуаций, где без них не обойтись. В данном конкретном случае
> рекомендуется использовать перечислимые константы enum - они "светятся"
> в отладчиками именами.
Биты светится не будут. Если нам нужно определить битовые поля, то это
дело вкуса, как сделать. В Unix традиции определялись константные
значения битов через #define, существует также другая традиция, делать
их в enum и например, ещё и тип определять новый:
typedef enum {
FLAGS_ENABLE_OPTION = 1 << 0,
FLAGS_ENABLE_ANOTHER = 1 << 1,
FLAGS_DO_SOMETHING = 1 << 2
} flags_t;
И тогда в функциях, которым передаётся аргумент в виде этих битовых
флагов, используется этот тип:
int do_something(flags_t flags);
и затем мы делаем так:
do_something(FLAGS_ENABLE_OPTION | FLAGS_ENABLE_ANOTHER);
Это значит что туда можно передавать комбинацию из логического ИЛИ из
этих флагов (об этом отдельно упоминается в документации к функции). Тип
определяли мы только для ясности. Это опять же чисто типографский метод
для того чтобы код проще было читать, особенно если флагов много.
Перечислимый тип в Си вовсе не означает что он может принимать только
значения из перечисления, можно сунуть любое. Он введён для удобства
чтения программы и конечно же, как заметили, в отладчике будет видно
символьное представление, если там соответствующее есть, если нет, то не
будет.
Вообще в хорошем API флагов будет мало или совсем не будет. С этой точки
зрения Unix API часто критикуют, но в целом, они все довольно быстро
запоминаются и проблем с ними нет.
Светиться в отладчике будет если действительно используется перечислимый
тип, т.е. значения ТОЛЬКО из enum. В нашем случае это не перечисления а
битовые поля из которых можно составлять комбинации через логическое ИЛИ.
Поэтому в нашем случае как делать, через #define или же enum - дело
вкуса, ещё раз повторюсь.
--
Г.А.
Подробная информация о списке рассылки Lab