Search code examples
ctypesstructlibuv

What does a struct type before a pointer argument do?


I would like to know what following syntax does:

func((some_type*) apointer)

Is this a simple type check or does this do something more? Why are there brackets required around the type?

whole example from http://nikhilm.github.com/uvbook/networking.html#tcp:

int main() {
    loop = uv_default_loop();

    uv_tcp_t server;
    uv_tcp_init(loop, &server);

    struct sockaddr_in bind_addr = uv_ip4_addr("0.0.0.0", 7000);
    uv_tcp_bind(&server, bind_addr);

    /* here it is */
    int r = uv_listen((uv_stream_t*) &server, 128, on_new_connection);

    if (r) {
        fprintf(stderr, "Listen error %s\n", uv_err_name(uv_last_error(loop)));
        return 1;
    }
    return uv_run(loop, UV_RUN_DEFAULT);
}

Regards, Bodo

Update:

Could this work?

typedef struct one_t
{
    int counter;

} one_t;

typedef struct two_t
{
    another_t request;
} two_t;

(one_t*) two_t

Solution

  • (uv_stream_t*)&server
    

    is a cast. It is used here as a polymorphism emulation in C.

    uv_tcp_t may be declared like:

    typedef struct uv_tcp_t
    {
        uv_stream_t base; //base has to be first member for byte reinterpretation to work
    
        /*...snip...*/
    
    } uv_tcp_t;
    

    This allows uv_listen to operate on uv_tcp_t as if it was an uv_stream_t variable.

    It is common, and (AFAIK) perfectly valid C.