Могу ли я использовать IN6_IS_ADDR_LOOPBACK из Windows SDK и т. д. др., несмотря на отсутствие документации?

В 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» не дает абсолютно никаких полезных или авторитетных результатов.

Итак, это приводит меня к двум вопросам:

  1. Безопасно ли использовать эти функции, несмотря на отсутствие документации? Если бы это были макросы, я бы из предосторожности определил их внутри блоков #ifndef, но это настоящие функции, поэтому я не могу этого сделать. Мне приходится либо использовать их как есть, либо повторно реализовать под другими именами, чтобы предотвратить ошибки перегрузки.
  2. Почему бы их не задокументировать? Они явно полезны и предназначены для отражения одноименных макросов Linux.

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

Luke 29.09.2023 23:32

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

Ron Maupin 02.10.2023 17:24

Обратите внимание, что эти макросы не являются макросами Linux, они соответствуют стандарту POSIX: «Заголовок <netinet/in.h> должен определять следующие макросы, которые проверяют специальные адреса IPv6. Каждый макрос имеет тип int и принимает один аргумент типа const struct in6_addr *: ..."

Andrew Henle 04.10.2023 15:56
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
3
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку (полезные) комментаторы Люк и Рон решили публиковать комментарии, а не ответы, я суммирую их комментарии и свой собственный опыт в ответ.

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

Я скажу, что очень жаль, что Microsoft решила реализовать их в виде функций, а не макросов, что делает невозможным, если не невозможным, проверку их существования (и реагирование на их отсутствие).

Другие вопросы по теме

Похожие вопросы

Одни и те же операции с переменными одинакового типа в одной области занимают разное время в одном и том же коде C
Почему моя программа на языке C не печатает сообщение об ошибке после того, как условие в моем операторе if истинно?
Vitis HLS Указатель на указатель не поддерживается для переменной при инициализации массива структур
Предупреждение: передача аргумента 1 из «strcmp» делает указатель целым числом без приведения [-Wint-conversion]
Чтение сокета UNIX происходит, даже если клиент не отправляет данные
Макрос C с ошибкой функции: выражение нельзя использовать как функцию
Я исправил ошибку по ошибке и хочу понять, почему
Прогнозирование ветвей и UB (неопределенное поведение)
Почему в intsafe.h Win32api код беззнакового представления абсолютного значения целого числа такой странный?
Почему я получаю сообщение «Функция не была объявлена ​​в этой области»?