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

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

#define INVALID_SOCKET  (SOCKET)(~0)
#define SOCKET_ERROR            (-1)
 user70301630 мая 2012 г., 15:40
Вероятно, потому что это значение «легко обрабатывать». Они могли бы выбрать что-нибудь еще, правда.
 PlasmaHH30 мая 2012 г., 15:58
Обратите внимание, что вопрос как-то вводит в заблуждение. C ++ не определяет это определение, это из какой-то другой библиотеки / API. Таким образом, вопрос более точно задается как «почему библиотека XYZ» определяет его как таковой. И я почти уверен, что библиотека работает и под C, поэтому C или C ++ также не имеют никакого отношения к этому моменту.
 Michael J07 июн. 2012 г., 19:08
@ PlasmaHH - WinSock2.h является основным заголовком для библиотеки Windows WinSock. Он является частью Windows SDK и является наиболее распространенной реализацией сокетов, доступной для Windows. Этопочт совместим с разъемами BSD. Вы, конечно, правы, что он использует один и тот же заголовок для C и C ++.

Ответы на вопрос(4)

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

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

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

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

Решение Вопроса

двух),~0 равно-1, так что нет никакого значения для компилятора.

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

В сторону

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

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

 unj230 мая 2012 г., 19:36
Так для системы Windows, это для удобства чтения?
 Steve Jessop31 мая 2012 г., 00:57
@ kunj2aan: стесняюсь догадаться, что авторwinsock2.h думал, что главное отличие Я говорю вам, какая разницаI думаю, что делает.

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

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

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

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

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

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

Наблюдатели начали шептаться между собой, задаваясь вопросом, в чем суть проблемы. Но ведущий был в замешательстве (второй вид), быстро поблагодарил за отзыв и продолжил обзор.

"Я будунНе обращай внимания!», - закричал архитектор с пронзительным визгом, внезапно поднявшись, хлопнув ладонями по столу с каким-то глухим стуком.

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

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

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

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

Остальная часть обзора прошла без происшествий.

Ваш ответ на вопрос