Typedef struct declared as two types: "typedef struct x { .. } X, *XPointer"

c, pointers, struct

Solution

The Linux kernel coding style says to avoid these kinds of typedefs:

Chapter 5: Typedefs

Please don't use things like "vps_t".

It's a mistake to use typedef for structures and pointers. When you see a

vps_t a;

in the source, what does it mean?

In contrast, if it says

struct virtual_container *a;

you can actually tell what "a" is.

Problem

Sorry if this has been asked before, I wasn't really even sure what to search for to come up with this. When I create a `typedef struct`, I usually do something like this: ``` typedef struct myStruct { int a; int b; struct myStruct *next; } MyStruct; ``` So I declare it with `MyStruct` at the end. Then when I create functions that pass that in as a parameter, I write ``` int doSomething(MyStruct *ptr){ } ``` Yet I am collaborating with a friend on a project and I have come across his coding style, which is to also declare `*MyStructP` like this: ``` typedef struct myStruct { int a; int b; struct myStruct *next; } MyStructR, *MyStructP; ``` And then he uses `MyStructP` in his functions, so his parameters look like: ``` int doSomething(MyStructP) ``` So he doesn't have to use the `*` in the parameter list. This confused me because when I look at the parameter list, I always look for the `*` to determine if the arg is a pointer or not. On top of that, I am creating a function that takes in a struct I created and a struct he created, so my arg has the * and his does not. Ultra confusing!! Can someone give insight/comparison/advice on the differences between the two? Pros? Cons? Which way is better or worse, or more widely used? Any information at all. Thanks!

Original source

Related problems