You have to distinguish between definitions and declarations.
When you define a type you are defining an alias name for a variable type, scalar or aggregate. I.e. in:
struct WorkMatType {
long Pointer2Component;
long StoichCoef;
};
You define in structures namespace an alias WorkMatType as a new aggregate variable type.
Then you can instantiate variables, direct or derivate, using the alias type name in a declaration. The following line shows an example for direct and derivate type, in this case a pointer to the structure:
struct WorkMatType WorkMat; //direct type
struct WorkMatType *WorkMatPtr; //derivate type, a pointer
In header files, normally you will put definitions of types; if you put a variable declaration, that variable will be instantiate in any module that include the header.
The result generally is a multiply symbol definition error in the linking phase. But if you define as static a variable with same name as the global one, the error will not be present, and the compiler will create a local copy of the variable that will be referred in the whole module instead of the global one.
If you want to define a global variable to be used in all modules you have to insert in the header an extern definition that doesn't instantiate a variable, but instruct the linker to refer to the global symbol with that name. I.e.
extern struct WorkMatType *WorkMat; //extern definition in header file
Then you will instantiate the global variable in one, and only one, module using the declaration:
struct WorkMatType *WorkMat; //this declaration will instantiate this variable. To be used in one module only.