typedef struct Module Module;
typedef struct Application Application;
That's complete nonsense (and may in fact lead to warnings or errors). C++ (and AFAIK ANSI C as well) already let you use the struct name without having to precede it with the struct qualifier!
On a sidenote: using a self-defined type name that is identical to the name of a previously defined type is at the very least confusing, and AFAIK an error, too: whenever the conpiler finds the name Application it won't know whether you mean your typedef'd name or the struct by that name! You can define two variables of the same name within the same scope legally (to the effect that the variable defined last will hide access to the first), but you can not define types of the same name. This may in fact be the cause of your problem.
extern int Engine_Module_Begin(Engine_Module *this);
Another piece of nonsense:
this
has no meaning in C, but may lead to confusion for those who know C++. In fact, if you try to compile that in C++ your compiler will likely complain, because
this
is a reserved keyword!
As for your problem, the code you've shown doesn't even use
Engine_Module
(it uses
Engine::Module
instead), so the problem must be in other parts of your code.
More generally, I advise you to drop the dual C++/C program structure idea. If you want to make your engine accessible to both C and C++ programmers then you should just write it in C++ and then - when it's done - provide C function wrappers that hide the C++-specific interface. You're needlessly hamstringing your development by always trying to fit your API to both at once, and that simply will not work!
P.S.:
After checking the references I've found that structs in ANSI C still require the struct keyword to be used, so some sort of typedef is still necessary. However, in C++ it is not necessary, and reusing the struct name as typedef name may in fact be the casue of errors. So if the same code is compiled for both C and C++ you need to make sure those typedefs are excluded for C++ compilation!