Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unfamiliar C syntax?

Tags:

c

libuv

I am trying to understand C code written by others and have come across a piece of code that I do not understand all of the syntax and the parts I don't understand I don't know how to search for. I would appreciate either an explanation or information on how to search this and other similar things I may encounter, or both. The code in question is the following line:

int r = uv_listen((uv_stream_t*) &server, 128, on_new_connection);

I understand that r is a variable that is being declared and initialized to the value returned by the function "uv_listen()", 128 is a literal int paramater, on_new_connection has to be a function pointer since that is the name of a call back function that is called. server is a variable of a custom type (uv_tcp_t) and with the & it is referring to the address of server. What I don't understand is the "(uv_stream_t*) &server". It looks like this is one of the parameters to the function. I could understand a function call that returned a value as a parameter but this doesn't look like a function call. "uv_stream_t" is another custom type that is defined in their code.

I don't know if it is helpful in understanding what it means but the line of code is from sample code written to help in understanding how to use libuv.

like image 491
Edward Goodson Avatar asked Jun 10 '26 10:06

Edward Goodson


2 Answers

It's just a type cast. &server gives the address of the server variable and (uv_stream_t*) casts the type of that address.

Based on the other information in your post, it seems that server is of type uv_tcp_t, but uv_listen wants a pointer to uv_stream_t. That's why you take the address of server and cast it to uv_stream_t*.

Note: this only makes sense because of how libuv defines uv_tcp_t and uv_server_t — in general you can't just cast pointer types to other pointer types and expect anything reasonable to happen.

like image 192
Scott Olson Avatar answered Jun 13 '26 01:06

Scott Olson


(uv_stream_t*) &server is taking the server address and casting it to a uv_stream pointer.

&server - take address of server

(uv_stream*) - cast to uv_stream pointer

like image 25
spartacus Avatar answered Jun 13 '26 00:06

spartacus



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!