The struct is a declaration of a type. You cannot mix it with the initialization. This is how it could be: In foo.h: #ifndef FOO_H #define FOO_H struct Foo{ int randInt; }; extern struct Foo foo; struct Foo *initFoo(struct Foo *foo_ptr); #endif In foo.c: #include "foo.h" struct Foo foo; struct Foo *initFoo(struct Foo *foo_ptr) { if (!foo_ptr) return NULL; foo_ptr->randInt = random(0, 101); return foo_ptr; } random() is a function and therefore its return value cannot be used as static initializer.