I've been using defines as fucntions like this:
sbit DRIVE_PIN05 = P1^3;
#define DRIVE_PIN05_HIGH (P1MDOUT |= 0x08);(DRIVE_PIN05 = 0) #define DRIVE_PIN05_LOW (P1MDOUT |= 0x08);(DRIVE_PIN05 = 1) #define DRIVE_PIN05_OFF (P1MDOUT &= 0xF7);(DRIVE_PIN05 = 1)
Is it there anything wrong with doing it like this? It gives me problems when I include the above define into another define, why?
#define SUPPLY_ON (DRIVE_PIN05_HIGH);(DRIVE_PIN24_LOW) #define SUPPLY_OFF (DRIVE_PIN05_OFF);(DRIVE_PIN24_OFF)
Maybe my syntax is incorrect or it can't be done?
Is it there anything wrong with doing it like this? It gives me problems when I include the above define into another define, why? I, occasionally, run into the same problem, and always I find that a define using another define is there before the define of the define used.
in other words: is e.g. DRIVE_PIN05 defined earlier in the file than the include of #define DRIVE_PIN05_OFF (P1MDOUT &= 0xF7);(DRIVE_PIN05 = 1). The preprocessor is not multi pass, if something is not defined before it is used, no go.
Erik
"Maybe my syntax is incorrect or it can't be done?"
For multi-statement macros, the convention is to wrap them with do/while(0). The parentheses are unnecessary.
#define DRIVE_PIN05_HIGH do {P1MDOUT |= 0x08; DRIVE_PIN05 = 0;} while (0) #define DRIVE_PIN05_LOW do {P1MDOUT |= 0x08; DRIVE_PIN05 = 1;} while (0) #define DRIVE_PIN05_OFF do {P1MDOUT &= 0xF7; DRIVE_PIN05 = 1;} while (0) #define SUPPLY_ON do {DRIVE_PIN05_HIGH;DRIVE_PIN24_LOW;} while (0) #define SUPPLY_OFF do {DRIVE_PIN05_OFF; DRIVE_PIN24_OFF;} while (0)
I forgot to mention that the style convention for function-like macros is to have them look like function invocation where they are used; that is, with a parameter list that is optionally empty.
#define SUPPLY_ON() do {DRIVE_PIN05_HIGH;DRIVE_PIN24_LOW;} while (0) #define SUPPLY_OFF() do {DRIVE_PIN05_OFF; DRIVE_PIN24_OFF;} while (0) void supply(unsigned char on) { if (on) SUPPLY_ON(); else SUPPLY_OFF(); }
It gives me problems when I include the above define into another define, why?
Impossible to tell, from the given info. You forgot to disclose both the actual problems this gave you, and an actual, compilable example case. So nobody can see the error messages you're seeing.
That leaves guesswork, most of which would reduce to: you want to (re-)read the C FAQ, in particular this node: c-faq.com/.../multistmt.html
Not quite. It's not necessarily a problem if the definition of DRIVE_PIN05 doesn't precede the line
#define DRIVE_PIN05_OFF (P1MDOUT &= 0xF7);(DRIVE_PIN05 = 1)
It only has to precede every actual expansion of DRIVE_PIN05_OFF, i.e. each time it's DRIVE_PIN05_OFF is used outside of a macro body.
#define B A #define A C B
preprocesses to
C
as intended.
Thanks to Dan and Hans-Bernhard.
I appreciate the help, solved the problem looking at your macro defenitions and the link.
MC