External C function and duplicate symbol
Hi guys, I've few functions that I'm keeping on an external .h file. If the header is included in more than a class I get duplicate symbol error. I tried using #ifndef which I use on my C++ classes but didn't bring any luck. I had a look to the various headers in the framework and I saw they use the following sintax: #define VEC_ZERO_2(a) \ { \ (a)[0] = (a)[1] = 0.0; \ } Isn't there a way to achieve the same but having parameters and returns typed? Thanks, chr ___ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com Help/Unsubscribe/Update your Subscription: http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to [EMAIL PROTECTED]
Re: External C function and duplicate symbol
What about using #pragma once at the top of the header file? The other solution is to move the functions to a C file and move just the function definitions to header files. I prefer the second for readability. I usually have a utils.c and a utils.h. I'm not a big fan of function implementations in header files. Scott On Oct 3, 2008, at 4:19 AM, Christian Giordano wrote: Hi guys, I've few functions that I'm keeping on an external .h file. If the header is included in more than a class I get duplicate symbol error. I tried using #ifndef which I use on my C++ classes but didn't bring any luck. I had a look to the various headers in the framework and I saw they use the following sintax: #define VEC_ZERO_2(a) \ { \ (a)[0] = (a)[1] = 0.0;\ } Isn't there a way to achieve the same but having parameters and returns typed? Thanks, chr ___ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com Help/Unsubscribe/Update your Subscription: http://lists.apple.com/mailman/options/cocoa-dev/scottandrew%40roadrunner.com This email sent to [EMAIL PROTECTED] ___ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com Help/Unsubscribe/Update your Subscription: http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to [EMAIL PROTECTED]
Re: External C function and duplicate symbol
It seems that what you want is an inline C function. I don't think this is part of the C language standard but gcc seems to have its own method of doing this. Just do a find on 'inline' in the Frameworks to see how it's done. Look at CGBase.h for instance. On Oct 3, 2008, at 8:32 AM, Scott Andrew wrote: What about using #pragma once at the top of the header file? The other solution is to move the functions to a C file and move just the function definitions to header files. I prefer the second for readability. I usually have a utils.c and a utils.h. I'm not a big fan of function implementations in header files. Scott On Oct 3, 2008, at 4:19 AM, Christian Giordano wrote: Hi guys, I've few functions that I'm keeping on an external .h file. If the header is included in more than a class I get duplicate symbol error. I tried using #ifndef which I use on my C++ classes but didn't bring any luck. I had a look to the various headers in the framework and I saw they use the following sintax: #define VEC_ZERO_2(a) \ { \ (a)[0] = (a)[1] = 0.0; \ } Isn't there a way to achieve the same but having parameters and returns typed? ___ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com Help/Unsubscribe/Update your Subscription: http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to [EMAIL PROTECTED]
Re: External C function and duplicate symbol
Hi Christian If you really want a function to appear in multiple object files you could declare them static, like in: static void vec_zero2(int *vect) { vec[0] = vec[1] = 0; } This is sometimes useful if you want to inline small functions and not use preprocessor macros like this: static inline char *code_long(char *dst, u_int32_t in) { dst[0] = (in 24) 0xff; // '' for readability only dst[1] = (in 16) 0xff; dst[2] = (in 8) 0xff; dst[3] = (in 0) 0xff; // '' for readability only return dst; } This works also mixing C and Obj-C: static void callSomething(id myObject, int x, y) { [myObject withX:x andY:y]; [myObject setTitle:[NSString stringWithFormat:@Position: %d,%d, x, y]]; } Of course this will increase your code size if you are not considering the size of your static functions. 'otool' or the assembler listing within XCode is useful to look at the generated code. Everything else should be declared 'extern' and implemented in one source file only. That's only my opinion, of course. Regards, Patrick On 03.10.2008, at 13:19, Christian Giordano wrote: Hi guys, I've few functions that I'm keeping on an external .h file. If the header is included in more than a class I get duplicate symbol error. I tried using #ifndef which I use on my C++ classes but didn't bring any luck. I had a look to the various headers in the framework and I saw they use the following sintax: #define VEC_ZERO_2(a) \ { \ (a)[0] = (a)[1] = 0.0;\ } Isn't there a way to achieve the same but having parameters and returns typed? Thanks, chr ___ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com Help/Unsubscribe/Update your Subscription: http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to [EMAIL PROTECTED]