簡體   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