We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Hi, I've split my project into files. I've defined some global variables in one of the header files as follows: unsigned char ToneDisp[16] = {'D','1','2','3','4','5','6','7','8','9','0',0x2A,0x23,'A','B','C'}; struct channel xdata Ch[16]; unsigned char CHANNELTYPE[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; These variables are used in other files too. Compiling the files individually everything goes fine while building the project results in: *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS How can I avoid this? Shouldn't I 've defined the global variable that way?? Thanks for your attention in advance A.E.
I always define variables in a header file. Not really you don't. You just put another layer of cloaking around the fact, using the preprocessor, but at the heart of it, your technique still does what I said has to be done: declare in the header file (i.e. in all "ordinary" uses, in your case), and define in a .c file (the one where you #define VARACT). Actually, as given, that technique has several drawbacks: 1) it only works for uninitialized definitions. You'ld need additional hacks to hide the initializers from client modules. 2) I rather strongly object to #define'ing a type name. The language has the concept of a typedef for a reason. 3) I would object even stronger to mingling the linkage ("extern" or not) into the type name. For one thing, it makes your 'U8' definition unusable for local variables.
3) I would object even stronger to mingling the linkage ("extern" or not) into the type name. For one thing, it makes your 'U8' definition unusable for local variables. I tried to keep it simple, but here we go #define U8 unsigned char // for internal use define UC qqq U8 // for global variable Hans-Bernhard, You have your ideas like I rather strongly object to #define'ing a type name. The language has the concept of a typedef for a reason I honestly don't give a hoot what you do in your place as long as it works for you, In my place I do what works for me. There is no reason, whatsoever, to do something in a given way because K&R makes it possible or suggest it as 'proper'. If one way fit you, use it whatever else K&R may have come up with. My whole 'system' is based on avoiding pitfalls and if the 'improper' use of headers for variables definition saves me ONE mistake I do not give one dime for the properness of it. Erik We can continue this discussion with what is correct While(1){} or for(;;){} but let us not, you have your opinion and is welcome to it, I have mine.