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

型システムをバイパスするのはトリックです。

設定できるさまざまなオプションはさまざまな型であるため、関数は任意の型へのポインターを受け取ることができるようにconst void *、最後の引数 (つまり、オプション値、ドキュメントを参照) として受け入れます。ssh_options_setそのようなポインターは、設定されている特定のオプションに応じて、内の正しいポインター型に再キャストされます。

他の型をキャストできる「ジェネリック型」がないため、これは値渡しでは実行できませんでした (さまざまな型がさまざまなサイズを持っているという事実だけでも - 代わりに、特定のアーキテクチャ上のポインターは常にそれが参照するタイプに関係なく、同じサイズ); C++ でこの問題を解決または軽減するために、オーバーロードとテンプレートがありますが、ここでは C について話します。

于 2012-01-01T21:50:20.503 に答える
2

これは、 ssh_options_setが 3 番目の引数としてポインターを想定しているためです。2 番目の引数の値に基づいて、実際のデータ型を計算します。

于 2012-01-01T21:49:40.260 に答える
1

おそらく、必要な実際のデータ型は、設定しているオプションによって異なるためです。a を介してアドレスですべてを渡すことconst void *は、それを実現する簡単な方法です。

于 2012-01-01T21:49:18.857 に答える