//5623.h extern DEVICE_REQUEST data ep0_cmd; //usb.h typedef struct { /* */ }DEVICE_REQUEST; //define.c DEVICE_REQUEST data ep0_cmd _at_ 0x18 = {0}; Build target 'Target 1' compiling main.c... 5623.H(4): error C129: missing ';' before 'data' compiling motor.c... 5623.H(4): error C129: missing ';' before 'data' compiling scsi.c... 5623.H(4): error C129: missing ';' before 'data' compiling usb.c... 5623.H(4): error C129: missing ';' before 'data' compiling define.c... 5623.H(4): error C129: missing ';' before 'data' Target not created
so either 5623.h must include usb.h before the declaration or main.c must include usb.h before including 5623.h. And here's one strong piece of advice: by all means, whenever remotely possibly, avoid that second choice. Header files should always be self-contained and idempotent, i.e. their effect should not depend on anything being present or absent in the file they're getting #included in, before their #include line. The way to achieve that is this *) if a header file references any elements defined in some other header file, it has to #include that other header *) except for rare exceptions, every header file shall have multiple-inclusion guards, so it can be included in a single translation unit arbitrarily many times. As a rough test, each header file you write should be compilable without errors, all by itself, and #including it 20 times in a row may not cause errors.