По мотивам разговора в Почему программы на с++ тормозят :) решил оформить это отдельной темой.
В исходниках GNU grep я наткнулся на такое:
/* Whether to output filenames. 1 means yes, 0 means no, and -1 means
'grep -r PATTERN FILE' was used and it is not known yet whether
FILE is a directory (which means yes) or not (which means no). */
static int out_file;
/* Which command-line options have been specified for filename output.
-1 for -h, 1 for -H, 0 for neither. */
int filename_option = 0;
/* Don't output file names if invoked as 'grep -r PATTERN NONDIRECTORY'. */
if (out_file < 0)
out_file = !!S_ISDIR (st.st_mode);
Тут явно напрашивается enum вместо магических констант. О чем я сразу подумал. А дальше в коде я наткнулся еще на такой однострочник, с которым без поллитры не разобраться:
out_file = (filename_option == 0 && num_operands <= 1
? - (directories == RECURSE_DIRECTORIES)
: 0 <= filename_option);
В общем, я подумал, что эта лапша наверное родом откуда-то из конца 80-х - начала 90-х, когда код писали в «хакерских традициях». Но нет. Всё это безобразие было введено в 2019-м году в 3-х коммитах под следующими заголовками:
Автор сначала ввёл enum-ы как разумный разработчик. А потом выкинул их, заменив на числа и магические операции сравнения а ля больше/меньше/равно нулю.
Не делайте так. Не хакерствуйте над битами как для конкурса IOCCC.
c, grep, рефакторинг