可以将套接字作为 const 传递给函数吗?
Is it ok to pass a socket to a function as const?
假设我有一个名为 socket
的 windows 套接字。如果 socket
被传递给一个不写入它的函数。例如,假设一个函数向客户端发送一个简单的 message/bytes,例如 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
无论作用域如何,总是在可写内存中?
将顶级 const
添加到函数参数总是安全的。这甚至不是函数签名的一部分,它只是告诉编译器在函数体内你不会将参数更改为不同的值;这反过来让编译器在您重新分配参数的地方发现错误。
请注意,当您调用 send
时,第一个参数接收参数 socket
的 copy
(也称为“按值传递”)。所以 socket
是否在可写内存中没有区别。
A SOCKET
只是一个整数(具体来说,SOCKET
是 UINT_PTR
的别名,即指针大小的无符号整数),所以它并不重要你的例子,如果你把它作为 const
传递或不传递,因为你是按值 传递它 。 send()
接受非常量值的 SOCKET
,所以无论如何你的 SOCKET
都会被值复制。
如果您愿意,可以通过 const
传递您的 socket
参数,这仅意味着您的函数无法为 socket
参数分配新值。它与 SOCKET
引用的底层套接字资源无关。
假设我有一个名为 socket
的 windows 套接字。如果 socket
被传递给一个不写入它的函数。例如,假设一个函数向客户端发送一个简单的 message/bytes,例如 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
无论作用域如何,总是在可写内存中?
将顶级 const
添加到函数参数总是安全的。这甚至不是函数签名的一部分,它只是告诉编译器在函数体内你不会将参数更改为不同的值;这反过来让编译器在您重新分配参数的地方发现错误。
请注意,当您调用 send
时,第一个参数接收参数 socket
的 copy
(也称为“按值传递”)。所以 socket
是否在可写内存中没有区别。
A SOCKET
只是一个整数(具体来说,SOCKET
是 UINT_PTR
的别名,即指针大小的无符号整数),所以它并不重要你的例子,如果你把它作为 const
传递或不传递,因为你是按值 传递它 。 send()
接受非常量值的 SOCKET
,所以无论如何你的 SOCKET
都会被值复制。
如果您愿意,可以通过 const
传递您的 socket
参数,这仅意味着您的函数无法为 socket
参数分配新值。它与 SOCKET
引用的底层套接字资源无关。