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

时间:2015-06-09 13:55:52

标签: c++ sockets

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

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

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

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

3 个答案:

答案 0 :(得分:3)

setsockopt

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

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

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

答案 1 :(得分:0)

确实存在相当混乱,因为setsockopt()支持大量不同的选项(SO_KEEPALIVE只是其中之一)。

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

    • 这可确保setsockopt()原型对于SO_ * options
    • 的所有未来值保持不变
  • 在C中
  • ,"任何指针"写作" void *"

  • & opt is"指向opt" (或" opt的地址")

  • as" opt"有类型int,"& opt"类型为int *,因此要将其转换为void *,有一个"显式转换" (void *)& opt in your code

    • 然而,在大多数情况下,没有必要,因为无效*是隐含的,如此简单"& opt"应该
  • 这种诡计虽然在C API中很常见,但在C ++中通常是不鼓励的,所以不要把它作为"如何编写C ++程序的例子"

答案 2 :(得分:0)

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

  

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

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

在您的情况下,

&opt会将指针/地​​址返回到opt类型的(int *),因此需要将其转换为(void *)。另外,在为C ++编写时,更喜欢使用explicit type conversions