I am porting some code to 8051 and the existing code uses #define to determine whether or not some functionality is available i.e. ....
#define HAVE_STRING_H . . . . #ifndef HAVE_STRING_H #include <string.H #else #include <homegrown/string.h> #endif
#define HAVE_STRING_H
#define HAVE_STRING_H 1
#ifdef HAVE_STRING_H
#if HAVE_STRING_H
Apart from the missing chevron in the first #include line what you have looks fine. It must be something else causing the error. Stefan
Whoops, that should be
#include <string.h>
Stefan, Thanks. Looking at this a little closer, it was using #if where it should've used #ifdef. Guess I had this backwards. Robert
I'm more a fan of the ANSI style: #if defined(SYMBOL) #if !defined(SYMBOL) But the old #ifdef style is still supported.
"I'm more a fan of the ANSI style" Yes, me too. I notice that modern compilers seem to deal sensibly with this: #if SYMBOL ... #endif If SYMBOL has not been defined you get an 'undefined symbol' error. At least one ancient compiler I use from time to time treats SYMBOL as false in this situation, which is a real nuisance. Stefan
"If SYMBOL has not been defined you get an 'undefined symbol' error." Not with an ANSI/ISO compliant compiler. If an undefined macro name appears in the constant-expression of #if or #elif, it is replaced by the integer constant 0.
"Not with an ANSI/ISO compliant compiler. If an undefined macro name appears in the constant-expression of #if or #elif, it is replaced by the integer constant 0." Well there you go, I'd never realised that was supposed to happen. I realise now that the modern compilers I use issue a warning rather than an error (making them compliant - I understand that 'Warning: Cup of tea required at line 37' is permitted by the standard). In this case it seems very sensible to issue a warning... Stefan
I'd never realised [undefined substituted with 0] was supposed to happen Good ol' K&R behavior. It helps contribute to the popular trap when people try to use the conditionals with nice readable string values instead of integers: -DPLATFORM=EVAL #if PLATFORM == EVAL #elif PLATFORM == SIM #endif Works like a charm, since PLATFORM becomes EVAL, and then EVAL on both sides of the first == becomes 0. 0 == 0, so off you go with the first branch, even if you -DPLATFORM=SIM. A warning can be a good thing. (You can actually make this work if you #define a series of constants for EVAL, SIM, etc., in a header, and are sure to include that header.)