Почему недопустимый сокет, определенный как ~ 0 в WinSock2.h(С++)?

В WinSock2.h неверная ошибка сокета и сокета определяется как это? Есть ли какое-либо значение для этого?

#define INVALID_SOCKET  (SOCKET)(~0)
#define SOCKET_ERROR            (-1)

Ответы

Ответ 1

В двухдополнительной системе (и Windows всегда является двумя дополнениями) ~0 равно -1, поэтому для компилятора нет никакого значения.

Для читателя может иметь значение: ~0 подчеркивает, что это значение со всеми установленными битами, тогда как -1 подчеркивает, что это значение 1 меньше 0.

Помимо

В системе, которая не является двумя дополнениями, и считая, что SOCKET является неподписанным типом, в общем случае неправильно писать (SOCKET)(~0). Причина в том, что в таких системах ~0 не представляет значение -1, это один из INT_MIN, отрицательный ноль или представление ловушки. Следовательно, он не обязательно будет преобразовывать тип SOCKET в качестве значения со всеми битами нуль, скорее он преобразует как INT_MAX+2, 0, или признает доброту - что (возможно, значение со всеми установленными битами).

Итак, вы должны инициализировать неподписанные типы с помощью -1, чтобы получить значение со всеми установленными битами. Вы можете использовать UINT_MAX или ~0UL или аналогичные, если знаете, с каким неподписанным типом вы имеете дело. Но это не стоит, потому что -1 работает для всех неподписанных типов.

Ответ 2

Давным-давно, рано утром в холодный дождливый день, посреди туманных зеленых покрытых холмов в причудливом, но растущем пригороде Сиэтла, штат Вашингтон, был небольшой, но разбросанный кластер зданий из красного кирпича, в одном из которых был конференц-зал среднего размера, где собиралось все большее число инженеров, менеджеров и архитекторов сетевого программного обеспечения. Встреча началась довольно тихо, и в основном мужская группа потягивала чашки чая и кофе, закручивая свои механические карандаши, сочиняя на своих блокнотах или царапая их пальмовые пилоты (был этот парень с Ньютоном, но все игнорировали его).

Когда ведущий продолжал прокручивать исходный код, он был остановлен одним из 5 архитекторов программного обеспечения, которые специально не были приглашены в обзор, но все равно появились. "Что, молись сказать, вот что", - буркнул он, виляя пальцем так же, как президент Клинтон. Ведущий остановился и уставился на палец, обнаружив, что он каким-то образом загипнотизировал шевеление пальцем, когда архитектор продолжал рыться. "Я сказал", - начал он повторять.

Ведущий посмотрел на экран и ничего не заметил. "О чем ты говоришь?" - спросил он.

Архитектор поднял брови, когда его лицо впервые произнесло ужас, затем обратилось к негодованию, а затем к запорам, когда он закричал: "Это откровенное нарушение правил кодирования!". Наблюдатели начали шептать между собой, задаваясь вопросом, в чем дело. Но ведущий был замешан (второй тип), быстро поблагодарил за отзывы и продолжил обзор.

"Меня не будут игнорировать!", - крикнул архитектор с высоким визгом, когда он внезапно встал, хлопнув ладонями к столешнице каким-то странным глухим стуком.

Комната разразилась, когда кулаки столкнулись с таблицей, и менеджеры начали разрабатывать способы покрытия своих сторонников, а инженеры начали листать свои руководства по стилю кодирования, в том числе оглавление, индекс, сноски и ссылки.

Ведущий оставался внешне невозмутимым, но чувствовал себя раздраженным, так как он отчаянно хотел, чтобы обзор был завершен, чтобы он мог отправиться на лыжную прогулку в Сноквальми. "Вы говорите о несоответствии типа?", Спросил он небрежно.

Архитектор на мгновение выглядел ошеломленным, но быстро передумал: "Очевидно", - фыркнул он.

Ведущий заменил два символа "-1" на "~ 0" и развернулся. Архитектор изучил это изменение, затем остальную часть экрана, затем посоветовался с его заметками, а затем, наконец, сел обратно.

Остальная часть обзора была беспрецедентной.

Ответ 3

В основном это неряшливость. -1 и ~ 0 - фактически одно и то же.

Можно утверждать, что ~ 0 - лучший стиль, поскольку сокет - это неподписанный int, но на самом деле он не имеет никакого значения для какой-либо практической цели.

Поскольку они используют "#define" вместо "const unsigned", вы по-прежнему открыты для странности. например.

    unsigned   a = SOCKET_ERROR;
    long long  b = a;
    if (b != SOCKET_ERROR)
        std::cout << "????\n";

может дать некоторым людям сюрприз.

Ответ 4

потому что SOCKET не имеет знака, поэтому не может использовать (-1).

Ответ 5

INVALID_SOCKET используется для функций, которые возвращают a SOCKET, который является указателем (как a HANDLE). В 32-битных системах это будет 32-битное значение, тогда как в 64-битных системах это будет 64-битное значение.

При правильном нажатии на целое число эквивалентного размера это будет то же самое, что и -1. Но гораздо безопаснее не предполагать, что он всегда будет правильно отбрасываться.

Ответ 6

Каждый (-1) есть (~ 0), но не каждый (~ 0) есть (-1).