在Linux上,netinet/in.h"应定义以下宏,用于测试特殊的IPv6地址.这包括IN6_IS_ADDR_UNSPECIFIEDIN6_IS_ADDR_LOOPBACKIN6_IS_ADDR_LINKLOCALIN6_IS_ADDR_SITELOCALIN6_IS_ADDR_V4MAPPEDIN6_IS_ADDR_V4COMPATIN6_IS_ADDR_MULTICAST等宏.这些都非常有用.

我在Windows(包括但不限于Winsock和Winsock 2)文档中广泛搜索类似的内容,但没有找到任何类似的内容.

但后来,我意外地发现,Windows SDK的ws2ipdef.h定义了一组functions个(not个宏),具有相同的名称和行为(example).我可以在许多Windows SDK版本中找到它,从最新的Windows 7到最早的Windows 7(我还找不到可以判断的较旧的Windows SDK版本),但只能直接判断头文件.作为复核,我特别查看了ws2ipdef.h的文档,它和它的任何子页面都没有提到任何这些函数.

此外,用引号加"Windows"搜索这些函数名称绝对不会得到任何有用或权威的结果.

所以,这就引出了两个问题:

  1. 在缺乏文档的情况下使用这些函数安全吗?如果它们是宏,我会谨慎地将它们定义在#ifndef个代码块内,但它们是实际的函数,所以我不能这样做.我必须按原样使用它们,或者使用不同的名称重新实现它们,以防止重载错误.
  2. 为什么他们不会被记录下来呢?它们显然很有帮助,旨在镜像同名的Linux宏.

推荐答案

由于(有帮助的) comments 者卢克和罗恩 Select 发布 comments 而不是答案,我将把他们的 comments 和我自己的经验总结成一个答案.

我一直找不到一个不包含这些镜像S宏的功能的Windows版本,而且它们似乎工作正常.Luke是对的,微软的文档严重缺乏,我不得不严重依赖StackOverflow和其他网站和博客来弄清楚如何正确使用GetAdaptersAddresses以及相关的函数和类型.它们是公共的、内联的函数,正如卢克所说,它们似乎是公平的游戏.Ron也是正确的,其中一些宏/函数是针对不推荐使用的地址范围的,因此应该谨慎使用.在我的特定情况下,我实际上是使用它们从这些不推荐使用的范围中筛选出地址,使它们特别适合我.

我要说的是,不幸的是,微软 Select 将它们作为函数而不是宏来实现,这使得测试它们的存在(以及对它们的不存在做出react )是不可行的,如果不是不可能的话.

C++相关问答推荐

ARM上的Modulo Sim Aarch 64(NEON)

如何在不修改字符串缓冲区早期使用的情况下覆盖字符串缓冲区

Zig将std.os.argv转换为C类型argv

C中空终止符后面的数字?

理解没有返回语句的递归C函数的行为

手动矢量化性能差异较大

为什么GCC在每次循环迭代时都会生成一个数组的mov&S使用[]访问数组?(-03,x86)

当输入负数时,排序算法存在问题

C中函数类型的前向声明

N的值设置为0或1(未定义的行为),而我正在try 学习realloc和Malloc的用法

在另一个函数中使用realloc和指针指向指针

#定义SSL_CONNECTION_NO_CONST

cairo 剪辑区域是否存在多个矩形?

在libwget中启用Cookie会导致分段故障

强制GCC始终加载常量(即只读),即使启用了优化

访问未对齐联合的成员是否为未定义行为,即使被访问的成员已充分对齐?

将char*铸造为空**

中位数和众数不正确

快速准确计算double的小数指数

运行以下 C 程序时出现分段错误