2012-01-01 15 views
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); 
} 
+0

Cで関数をオーバーロードできません。 – pmr

答えて

8

タイプシステムをバイパスするのは難しいことです。

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

これは値渡しではできませんでした。「ジェネリック型」は他の型をキャストすることができないためです(さまざまな型がさまざまなサイズを持っているアーキテクチャは、それがどのようなタイプであっても常に同じサイズです)。 C++でこの問題を解決または緩和するには、オーバーロードとテンプレートがありますが、ここではCについて話しています。

+0

ポート番号を "void *"にキャストして、 。 "void *"はあなたが話す "ジェネリックタイプ"です(int64はもっと大きいかもしれませんが)。しかし、私はそれがちょうど物事を醜くすることを認めます。 – ugoren

+0

@ugoren:整数型でも動作する可能性があります(ただし、明確な動作が得られるかどうかはわかりませんが)確かにほとんどの構造体は十分に小さくないでしょう(それは奇妙なキャストシーケンスを必要とします) 。 –

1

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

2

ssh_options_setは、3番目の引数としてポインタが必要であるためです。 2番目の引数の値に基づいて実際のデータ型を処理します。

関連する問題