我正在为我正在研究的linux程序编写一些代码,需要libssh。我正在查看他们的教程页面,我看到它通过引用将所有参数传递给ssh_options_set()
。那是为什么?
#include <libssh/libssh.h>
#include <stdlib.h>
int main()
{
ssh_session my_ssh_session;
int verbosity = SSH_LOG_PROTOCOL;
int port = 22;
my_ssh_session = ssh_new();
if (my_ssh_session == NULL)
exit(-1);
ssh_options_set(my_ssh_session, SSH_OPTIONS_HOST, "localhost");
ssh_options_set(my_ssh_session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity); //here
ssh_options_set(my_ssh_session, SSH_OPTIONS_PORT, &port); //here
...
ssh_free(my_ssh_session);
}
答案 0 :(得分:9)
绕过类型系统是一种技巧。
由于可以设置的各种选项具有各种类型,因此该函数接受const void *
作为最后一个参数(即选项值see the documentation),以便能够接收指向任何类型的指针;这样的指针将被重新转换为ssh_options_set
内的正确指针类型,具体取决于正在设置的特定选项。
这不能通过值传递来完成,因为没有“泛型类型”可以将任何其他类型转换为(即使只是因为各种类型具有各种大小 - 指针,而不是在给定的体系结构上)总是大小相同,无论它指的是什么类型);在C ++中解决或缓解这个问题有重载和模板,但这里我们讨论的是C。
答案 1 :(得分:2)
这是因为ssh_options_set期望指针作为第三个参数。它根据第二个参数的值计算出实际的数据类型。
答案 2 :(得分:1)
大概是因为所需的实际数据类型取决于您设置的选项。通过const void *
通过地址传递所有内容是实现这一目标的简便方法。