You can use either
struct _GRBmodel xxx;
or
GRBmodel xxx;
They mean the same thing. This method of programming has crept in because of recursive data structures. If it is not recursive, you can just use
typedef struct
{
...
} GRBModel;
The problem comes when it is recursive: how do you use something before it is defined since it cannot be forward declared? You will get a compilation error if you have something like
typedef struct
{
...
Recursive* left;
Recursive* right;
} Recursive;
To get around it, the struct needs to be given a name
typedef struct _Recursive
{
...
struct _Recursive* left;
struct _Recursive* right;
} Recursive;
Since it is not consistent: some have names and some don't have names, some developers have decided that everything should have names regardless of whether they are of any use.
The other thing you can do with typedef is multiple definitions.
typedef _Recursive Recursive, *PRecursive, **PPRecursive;
This will be familiar stuff for MS programmers: it appears all over the windows header files.