[英]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 *
它会被设置为该类型。
另请注意, &opt
是opt
对象的地址。 它不是参考。
它确实存在于第一位,因为setsockopt()支持大量不同的选项(SO_KEEPALIVE只是其中之一)。
为了启用传递任何参数(包括将来的扩展),他们说setsockopt()将接受指向参数的指针,其中参数类型是任何指针 (并且由option_name参数隐式定义,在本例中为SO_KEEPALIVE)。
在C中,“任何指针”写为“void *”
&opt是“指向选择”(或“选择地址”)
由于“opt”的类型为int,“&opt”的类型为int *,因此要将其转换为void *,代码中会有“显式强制转换”(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.