假设我有一个名为socket的windows套接字。如果socket被传递给一个不写它的函数。例如,假设一个函数向客户端发送一个简单的消息/字节,比如Hello you're connected to the server!。例如:
void send_hello(SOCKET socket, char* data) {
send(socket, data, sizeof(data), 0);
}将套接字作为const传递安全吗?例如:
void send_hello(const SOCKET socket, char* data) {
send(socket, data, sizeof(data), 0);
}我大脑中的一些东西告诉我,我应该将socket作为const传递,而不是将它作为可写内存传递。我知道套接字是文件描述符,所以我显然很困惑它们是如何工作的,以及它们是否总是或曾经被写入。但是,我的代码在将socket作为const传递时工作。
我的整体问题是:
是否可以将类型为SOCKET对象的变量传递为const?或者应该说SOCKET总是在可写内存中,而不管范围如何?
发布于 2020-11-10 23:16:08
将顶级const添加到函数参数中总是安全的。这甚至不是函数签名的一部分,它只是告诉编译器,在函数体中,您不会将参数更改为不同的值;这反过来会让编译器捕获您重新分配参数的错误。
请注意,当您调用send时,第一个参数是接收参数socket的copy (也称为“按值传递”)。因此,无论socket是否在可写内存中,都没有区别。
发布于 2020-11-11 00:55:55
SOCKET只是一个整数(具体来说,SOCKET是UINT_PTR的别名,即指针大小的无符号整数),所以在您的示例中如果将它作为const传递并不重要,因为您是通过值传递它的。send()通过非const值获取SOCKET,因此无论什么情况,SOCKET都会被值复制。
如果您愿意,可以通过socket参数传递您的const参数,这只意味着您的函数不能为socket参数分配新的值。它与SOCKET引用的基础套接字资源无关。
https://stackoverflow.com/questions/64778130
复制相似问题