строго говоря EV_NO_EVENT событием не является. Вы пытаетесь ввести в заблуждение окружающих и возможно себя. EV_NO_EVENT - это специальное маркерное значение, которое вы используете, чтобы показать, что в очереди событий нет данных. Т.е. ваша функция возвращает или реальные события ИЛИ маркерное значение. Такой подход часто используется в Сях по причине убогости языка и является оптимизацией данного случая:
if (has_event()) {
switch (get_next_event()) {
case EV_1:
case EV_2:
...
break;
default:
break;
}
} else {
Sleep();
}
Аналогично работает, например, библиотечная функция getchar и возвращает или прочитанный символ или специальное значение, чаще всего -1.
Подумайте о том, что в более серьезных языках, в которых очереди и списки реализуются на уровне языка, при попытке прочитать следующий элемент из пустой очереди или пустого списка вы получите исключение. В сях исключений нет, поэтому приходится использовать маркерные значения.
Дабы сразу ответить на возможные возражения:
* то, что маркерное значение для компилятора не отличается от реальных событий, не делает маркерное значение событием
* то, что маркерное значение удобно обрабатывать в том же switch, что и реальные события, не делает маркерное значение событием
* то, что вам удобно называть маркерное значение событием, не делает маркерное значение событием.