Hello, I have two c source files in my project, and they both need include hardware.h(register define) file. I try to include the .h file to both C file but the compilter says the memory overlap. I choice include .h file to the main C file ,the compiliter says another c file's register not define. How to avoid it , thanks a lot.
"'Include Guards' simply prevent you from #including the same header more than once" Note that this is a Good Thing! I am not denouncing the use of "Include Guards" - they are definitely worthwhile. I'm just saying that they have nothing to do with this particular problem!
yeah,you are right We must put the definition into the c source files,and declare them in the header files. //my.h #ifndef __MY_H__ #define __MY_H__ extrn unsigned char xdata A_register _at_ 0x0010; extrn unsinged char xdata B_register _at_ 0x0020;//unnecessary if the variables are not global #endif //__MY_H__ //My.c unsigned char xdata A_register _at_ 0x0010; unsinged char xdata B_register _at_ 0x0020; The include guard is necessary to avoid re-including.
Refer to the following knowledgebase article if you want to define and declare in a header file: http://www.keil.com/support/docs/1868.htm Jon
Still not quite right: do not put the _at_ in the header file - that just goes in the definition; only name & type are required in the declaration As I've said before, if you #include the header in the 'C' file, it will give you the advantage of allowing the compiler to warn you if there's any mismatch:
//My.c #include "my.h" // allows the compiler to "see" both declarations & definitions // and thus to report any mismatch! unsigned char xdata A_register _at_ 0x0010; // A message will be given if this definition // does not match the preceding declaration in // the header! unsinged char xdata B_register _at_ 0x0020;
Since we're already using the nonportable "_at_" language extension, we'll let the C++ and C99 "//" commenting style slide on by without any points deduction ;-)