Why would I want to do this?
typedef struct Frame_s
{
int x;
int y;
int z;
} Frame_t;
Also if I want to create an object what do I use Frame_s or Frame_t?
Why would I want to do this?
typedef struct Frame_s
{
int x;
int y;
int z;
} Frame_t;
Also if I want to create an object what do I use Frame_s or Frame_t?
You would use Frame_t.
With typedef you are saying that Frame_t and struct Frame_s are the exact same type.
So these are equivalent sentences:
// 1
Frame_t f;
// 2
struct Frame_s f;
I would use:
typedef struct
{
int x;
int y;
int z;
} Frame_t;
And always declare my vars like this:
Frame_t f1, f2, f3;
Confusion usually comes from places where you use that sentence in a C++ piece of code. If you use C++ with that typedef you can use either:
// 1
Frame_t f;
// 2
Frame_s f;
But if you use a plain C compiler, then //2 is invalid.
Either you use struct Frame_s, or you use Frame_t.
Usually you do such a typedef so that you can use the typedefed name, Frame_t, and don't have to write struct whenever you refer to the type.
Aside from Frame_t being shorter than struct Frame_s there is no real difference.
To declare a value of the struct, you could use either struct Frame_s foo or Frame_t foo (the latter is more normal, since that's the whole point of typedefing). My guess is that Frame_s is meant to indicate the struct type itself, while Frame_t is the plain type that's normally used for Frame values.
typedef is used as a short form. So when a function which returns a structure of this type, normally you write -
struct Frame_s *function_name()
The code start to get obfuscated. Function definitions become long etc. With this typedef you get -
Frame_t *function_name()
Clean code! Makes a big difference in maintenance...
So these two declarations are equivalent:
struct Frame_s f;
Frame_t f;
In fact, you could now leave Frame_s out of the declaration as it isn't needed.
typedef struct
{
int x;
int y;
int z;
} Frame_t;
Another aspect of typedef that has not yet been mentioned in the other replies is that it reserves the identifier and thus may avoid confusion. If you do a forward declaration like that
typedef struct Frame Frame;
you would avoid that some code that may use the same name Frame e.g a variable or function.
One very bad traditional example that comes in mind for this is "sys/stat.h" in POSIX: it defines a struct stat and a function stat:
int stat(const char *path, struct stat *buf);