繁体   English   中英

为什么引用的int被强制转换为void指针?

[英]Why is the referenced int being cast to a void pointer?

void Link::keepalive(bool enable){
    int opt = enable? 1 : 0;
    ::setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (void *)&opt, sizeof(opt));
}

我继续在一些更低级别的c函数中看到如下代码,特别是当它涉及套接字和网络操作时。

我来自一个python背景,我肯定四处寻找关于什么(void *)&opt正在做的很好的解释,但还没有找到一个很好的解释。

我知道引用只是一个有限制的指针。

setsockopt的签名

int setsockopt(int socket, int level, int option_name,
   const void *option_value, socklen_t option_len);  

它的第二个参数应该是void *类型。 &opt类型为void *它会被设置为该类型。

另请注意, &optopt对象的地址。 它不是参考。

它确实存在于第一位,因为setsockopt()支持大量不同的选项(SO_KEEPALIVE只是其中之一)。

  • 为了启用传递任何参数(包括将来的扩展),他们说setsockopt()将接受指向参数的指针,其中参数类型是任何指针 (并且由option_name参数隐式定义,在本例中为SO_KEEPALIVE)。

    • 这确保了对于SO_ *选项的所有未来值,setsockopt()原型保持不变
  • 在C中,“任何指针”写为“void *”

  • &opt是“指向选择”(或“选择地址”)

  • 由于“opt”的类型为int,“&opt”的类型为int *,因此要将其转换为void *,代码中会有“显式强制转换”(void *)&opt

    • 但是,在大多数情况下,没有必要,因为转换为void *是隐含的,所以简单的“&opt”应该这样做
  • 这种技巧虽然在C API中很常见,但在C ++中通常是不鼓励的,所以不要把它作为“如何编写C ++程序”的例子。

查看MSDN的setsockopt函数文档,特别是备注部分:

套接字选项有两种类型:启用或禁用功能或行为的布尔选项,以及需要整数值或结构的选项。 要启用布尔选项,optval参数指向非零整数。 要禁用选项optval指向等于零的整数。 对于布尔选项,optlen参数应等于sizeof(int)。 对于其他选项,optval指向包含选项所需值的整数或结构,optlen是整数或结构的长度。

在C API中,通常的做法是传递函数参数,这些函数参数可以是与指向内存中地址的最常规指针类型(void *)不同的类型/长度。

&opt返回指针/地址以在您的情况下opt类型(int *) ,因此需要将其强制转换为(void *) 另外,在为C ++编写时,更喜欢使用显式类型转换

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM