[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