Почему эта программа передает параметры по ссылке - PullRequest
0 голосов
/ 02 января 2012

Я пишу некоторый код для программы 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 ]

9 голосов
/ 02 января 2012

Это обходной прием системы типов.

Поскольку различные параметры, которые можно установить, имеют различные типы, функция принимает const void * в качестве последнего аргумента (т. Е. Значение параметра, см. документацию ), чтобы можно было получить указатель на любой тип;такой указатель будет повторно приведен к правильному типу указателя внутри ssh_options_set, в зависимости от конкретной устанавливаемой опции.

Этого нельзя сделать с передачей по значению, потому что нет универсального типа«вы можете привести любой другой тип к (даже просто потому, что разные типы имеют разные размеры - вместо этого указатель на данную архитектуру всегда имеет одинаковый размер, к какому типу он относится);Для решения или смягчения этой проблемы в C ++ существуют перегрузки и шаблоны, но здесь речь идет о C.

2 голосов
/ 02 января 2012

Это потому, что ssh_options_set ожидает указатель в качестве третьего аргумента.Он определяет фактический тип данных на основе значения второго аргумента.

1 голос
/ 02 января 2012

Предположительно, потому что фактический требуемый тип данных зависит от того, какой параметр вы устанавливаете. Передача всего по адресу через const void * - это простой способ добиться этого.

...