Reputation: 9263
How can I have a pointer to the next struct in the definition of this struct:
typedef struct A {
int a;
int b;
A* next;
} A;
this is how I first wrote it but it does not work.
Upvotes: 61
Views: 92327
Reputation: 793179
You can define the typedef and forward declare the struct first in one statement, and then define the struct in a subsequent definition.
typedef struct A A;
struct A
{
int a;
int b;
A* next;
};
Edit: As others have mentioned, without the forward declaration the struct name is still valid inside the struct definition (i.e. you can used struct A
), but the typedef is not available until after the typedef definition is complete (so using just A
wouldn't be valid). This may not matter too much with just one pointer member, but if you have a complex data structure with lots of self-type pointers, may be less wieldy.
Upvotes: 87
Reputation: 105
typedef struct {
values
} NAME;
This is shorter way to typedef a struct i think its the easiest notation, just don't put the name infront but behind.
you can then call it like
NAME n;
NAME *n; // if you'd like a ptr to it.
Anything wrong with this approach?
Upvotes: 0
Reputation: 205014
Please, you're in C, not C++.
If you really must typedef a struct (and most programmers that I work with would not¹), do this:
typedef struct _A {
int a;
int b;
struct _A *next;
} A;
to clearly differentiate between _A
(in the struct
namespace) and A
(in the type namespace).
¹typedef
hides the size and storage of the type it points to ― the argument (and I agree) is that in a low-level language like C, trying to hide anything is harmful and counterproductive. Get used to typing struct A
whenever you mean struct A
.
Upvotes: 9
Reputation: 8060
You are missing the struct
before the A*
typedef struct A {
int a;
int b;
struct A* next;
} A;
Upvotes: 21
Reputation: 35008
You can go without forward declaration:
struct A {
int a;
int b;
struct A *next;
};
Upvotes: 14
Reputation: 15767
In addition to the first answer, without a typedef and forward declaration, this should be fine too.
struct A
{
int a;
int b;
struct A *next;
};
Upvotes: 68