В Linux netinet/in.h «должен определить следующие макросы, которые проверяют специальные адреса IPv6». Сюда входят такие макросы, как IN6_IS_ADDR_UNSPECIFIED, IN6_IS_ADDR_LOOPBACK, IN6_IS_ADDR_LINKLOCAL, IN6_IS_ADDR_SITELOCAL, IN6_IS_ADDR_V4MAPPED, IN6_IS_ADDR_V4COMPAT, IN6_IS_ADDR_MULTICAST и другие. Все очень полезно.
Я тщательно искал аналоги в документации Windows (включая, помимо прочего, Winsock и Winsock 2) и не нашел ни одного.
Но затем случайно я обнаружил, что Windows SDK ws2ipdef.h определяет набор функций (не макросов) с одинаковыми именами и поведением (пример ). Я могу найти его во многих версиях Windows SDK, начиная с самых последних и вплоть до Windows 7 (мне не удалось найти более старые версии Windows SDK для проверки), но только путем непосредственного изучения файлов заголовков. Для проверки я просмотрел документацию конкретно по ws2ipdef.h, и ни в ней, ни на какой-либо из ее подстраниц не упоминается ни одна из этих функций.
Более того, поиск в Google имен этих функций в кавычках плюс «Windows» не дает абсолютно никаких полезных или авторитетных результатов.
Итак, это приводит меня к двум вопросам:
#ifndef, но это настоящие функции, поэтому я не могу этого сделать. Мне приходится либо использовать их как есть, либо повторно реализовать под другими именами, чтобы предотвратить ошибки перегрузки.Будьте осторожны, так как некоторые функции предназначены для устаревших диапазонов адресов (локальный сайт, IPv4-совместимый и т. д.), которые больше не имеют никакого значения. Кроме того, следует быть осторожным с многоадресной рассылкой, поскольку необходимо учитывать множество областей и флагов (не все адреса в диапазоне многоадресной рассылки действительны).
Обратите внимание, что эти макросы не являются макросами Linux, они соответствуют стандарту POSIX: «Заголовок <netinet/in.h> должен определять следующие макросы, которые проверяют специальные адреса IPv6. Каждый макрос имеет тип int и принимает один аргумент типа const struct in6_addr *: ..."





Поскольку (полезные) комментаторы Люк и Рон решили публиковать комментарии, а не ответы, я суммирую их комментарии и свой собственный опыт в ответ.
Мне не удалось найти версию Windows, которая не содержит этих функций, отражающих макросы netinet/in.h, и они работают правильно. Люк прав в том, что документации Microsoft крайне не хватает, и мне пришлось в значительной степени опираться на StackOverflow и другие веб-сайты и блоги, чтобы понять, как правильно использовать GetAdaptersAddresses и связанные с ним функции и типы. Это общедоступные встроенные функции, и, как сказал Люк, они кажутся честными. Рон также прав в том, что некоторые из этих макросов/функций предназначены для устаревших диапазонов адресов, поэтому их следует использовать с осторожностью. В моих конкретных случаях я фактически использовал их для фильтрации адресов из этих устаревших диапазонов, что делало их особенно подходящими для меня.
Я скажу, что очень жаль, что Microsoft решила реализовать их в виде функций, а не макросов, что делает невозможным, если не невозможным, проверку их существования (и реагирование на их отсутствие).
К сожалению, качество документации Microsoft в течение некоторого времени ухудшается, не говоря уже о, казалось бы, частых обновлениях MSDN, которые приводят к поломке многих ссылок. Как это часто бывает, код является окончательной документацией. В данном конкретном случае это общедоступные встроенные функции, поэтому их совершенно безопасно использовать как есть.