Difference between 'struct' and 'typedef struct' in C++?
c++, struct, typedef
Solution
In C++, there is only a subtle difference. It's a holdover from C, in which it makes a difference.
The C language standard (C89 §3.1.2.3, C99 §6.2.3, and C11 §6.2.3) mandates separate namespaces for different categories of identifiers, including tag identifiers (for `struct`/`union`/`enum`) and ordinary identifiers (for `typedef` and other identifiers).
If you just said:
struct Foo { ... };
Foo x;
you would get a compiler error, because `Foo` is only defined in the tag namespace.
You'd have to declare it as:
struct Foo x;
Any time you want to refer to a `Foo`, you'd always have to call it a `struct Foo`. This gets annoying fast, so you can add a `typedef`:
struct Foo { ... };
typedef struct Foo Foo;
Now `struct Foo` (in the tag namespace) and just plain `Foo` (in the ordinary identifier namespace) both refer to the same thing, and you can freely declare objects of type `Foo` without the `struct` keyword.
The construct:
typedef struct Foo { ... } Foo;
is just an abbreviation for the declaration and `typedef`.
Finally,
typedef struct { ... } Foo;
declares an anonymous structure and creates a `typedef` for it. Thus, with this construct, it doesn't have a name in the tag namespace, only a name in the typedef namespace. This means it also cannot be forward-declared. If you want to make a forward declaration, you have to give it a name in the tag namespace.
In C++, all `struct`/`union`/`enum`/`class` declarations act like they are implicitly `typedef`'ed, as long as the name is not hidden by another declaration with the same name. See Michael Burr's answer for the full details.
Problem
In C++, is there any difference between: ``` struct Foo { ... }; ``` and: ``` typedef struct { ... } Foo; ```