[英]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.