With C (but not C++) struct and enum definitions is that allow the use of tags. These are optional names that give a type name to the struct and are in effect like typedefs. You could declare the struct like this
struct {
int d;
} d;
which just declares the variable d in place with a int field d. It has no type as such. You wouldn't then need the line
struct d d;
So why would do you need tags? Linked Lists. This isn't particularly useful but it compiles!
struct d2 {
struct d2 * pd;
};
If a struct has a tag (ie has a named type) then you can declare a pointer to it within the struct.
- Link to C Programming Tutorials

