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

lod*_*kkx 0 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);
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*lia 9

这是绕过类型系统的一个技巧.

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

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