Этот код меня смущает:
/* First off, we need to check if this is a call for the "example-handler" handler.
* If it is, we accept it and do our things, if not, we simply return DECLINED,
* and the server will try somewhere else.
*/
if (!r->handler || strcmp(r->handler, "example-handler")) return (DECLINED);
В нем говорится: "проверьте, является ли это вызовом обработчика" обработчик примера ". ЕСЛИ НЕ, мы просто возвращаем DECLINED,
Я думал, что "если (strcmp (r-> обработчик," example-handler ")) return (DECLINED)" означал, что если сравнение строк возвращает true, поэтому, если это вызов для обработчика примера, DECLINED будет вернулся.
Это утверждение
if (!r->handler || strcmp(r->handler, "example-handler")) return (DECLINED);
означает
если обработчик r-> равен NULL, тогда возвращайте DECLINED
Или, если обработчик r-> не равен NULL, но его содержимое не равно строковому литералу "пример-обработчик", а затем возвращает DECLINED
Стандартная функция C strcmp
возвращает 0, если оба операнда равны друг другу и отличное от нуля значение.
Это выражение
strcmp(r->handler, "example-handler") != 0
означает, что операнды не равны друг другу.
Из стандарта C
Функция strcmp возвращает целое число, большее, равное или меньшее нуля, соответственно, поскольку строка, на которую указывает s1, больше, равна или меньше, чем строка, на которую указывает s2
Это выглядит правильно. strcmp
возвращает 0, если это совпадение. Поэтому вы продолжите, как следует из комментариев.
Это условие:
if (!r->handler || strcmp(r->handler, "example-handler")) return (DECLINED);
Может быть переписано более явно, как:
if (r->handler == NULL /* or nullptr in C++11 */ || strcmp(r->handler, "example-handler") != 0) return (DECLINED);
Что в основном означает, что он возвращает DECLINED, когда:
В man-страницах strcmp вы можете узнать, что strcmp возвращает ненулевое значение, когда строка отличается:
Функция strcmp() сравнивает две строки s1 и s2. Он возвращает целое число меньше, равное или больше нуля, если s1 найдено соответственно, чтобы быть меньше, соответствовать или быть больше, чем s2.
strcmp
не возвращает bool
, и поэтому не должен использоваться в контексте, где ожидается bool
. Оригинальный код - чистое запутывание.
r->handler != nullptr
. Некоторые авторы любят запутывать.