0

我正在为我正在处理的需要 libssh 的 linux 程序编写一些代码。我正在查看他们的教程页面,我看到它通过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);
}
4

3 回答 3

9

这是绕过类型系统的技巧。

由于可以设置的各种选项具有各种类型,因此该函数接受 aconst void *作为最后一个参数(即选项值,请参阅文档),以便能够接收指向任何类型的指针;ssh_options_set根据设置的特定选项,此类指针将被重新转换为内部正确的指针类型。

这不能通过值传递来完成,因为没有“通用类型”可以转换为任何其他类型(即使只是因为各种类型具有不同的大小 - 相反,在给定架构上的指针总是大小相同,无论它指的是什么类型);为了在 C++ 中解决或缓解这个问题,有重载和模板,但这里我们谈论的是 C。

于 2012-01-01T21:50:20.503 回答
2

这是因为ssh_options_set需要一个指针作为第三个参数。它根据第二个参数的值计算出实际的数据类型。

于 2012-01-01T21:49:40.260 回答
1

大概是因为所需的实际数据类型取决于您设置的选项。通过地址通过 a 传递所有内容const void *是实现这一目标的简单方法。

于 2012-01-01T21:49:18.857 回答