The typedef keyword is not required for C struct types. The only advantage it gives you is that it creates a single-word name for the type.
The declaration in your example:
struct demo { } synth;
there are actually two declarations, one for a struct demo type and one for an object of this type called synth . It may be more clearly written as two separate declarations:
struct demo { }; struct demo synth;
The first declaration creates a new type of structure. His name is struct demo . The second defines an object of this type called synth .
The demo identifier alone, given these declarations, makes no sense; it is a structure tag, and it only makes sense when the struct keyword precedes.
synth , on the other hand, is the name of an object (variable). It should not be, and indeed cannot be, preceded by the struct keyword.
You can add typedef if you want to give the struct demo type a middle name. (A typedef does not define a new type; it simply defines a new name, an alias, for an existing type.) For example, a common idiom:
typedef struct demo { } demo;
Like your original declaration, these are really two declarations, a struct definition that creates a struct demo type and a typedef that creates a new demo name for this type. It can be written as:
struct demo { }; typedef struct demo demo;
follows, if you want, by declaring the object:
demo synth;
(Note: there is no need for the struct tag and typedef to be different, and IMHO it is clearer for them to be the same.)
Choosing whether to use typedef for structure types is basically one of the styles. My personal preference is not to use typedef for structures; struct demo already has a great name. But many programmers prefer to have a name that has one identifier.