为什么这个程序通过引用传递参数

时间:2012-01-01 21:45:40

标签: c linux pointers libssh

我正在为我正在研究的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);
}

3 个答案:

答案 0 :(得分:9)

绕过类型系统是一种技巧。

由于可以设置的各种选项具有各种类型,因此该函数接受const void *作为最后一个参数(即选项值see the documentation),以便能够接收指向任何类型的指针;这样的指针将被重新转换为ssh_options_set内的正确指针类型,具体取决于正在设置的特定选项。

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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