2012-01-01 4 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 *"로 캐스팅하여 값으로 전달할 수 있습니다. . "무효 *"는 여러분이 이야기하는 "제네릭 유형"이라고 말할 수 있습니다 (int64는 더 클 수 있지만). 그러나 나는 그것이 단지 물건을 더 못되게 만든다는 것을 인정한다. – ugoren

+0

@ugoren : 정수형에 대해서는 작동 할 수 있지만 (잘 정의 된 동작을 발생 시킬지는 모르겠지만) 확실히 모든 구조체가 충분히 작지는 않습니다 (이상한 캐스트 연속이 필요합니다) . –

1

아마도 실제 데이터 유형은 필요한 설정에 따라 달라질 수 있습니다. const void *을 통해 주소로 모든 것을 전달하면 쉽게 달성 할 수 있습니다.

2

ssh_options_set은 세 번째 인수로 포인터를 기대하기 때문입니다. 두 번째 인수의 값을 기반으로 실제 데이터 형식을 처리합니다.