Macros
Macros are text replacements created with #define that insert code into your program. Macros may take parameters like a function but the macro code and parameters are always inserted into code by text substitution.
Macros:
- Are evaluated by the preprocessor
- Are not executable code themselves
- Can control the generation of code before the compilation process
- Provide shortcuts
Simple Macros
Syntax
#define label text
- Every instance of label in the current file will be replaced by text
- text can be anything you can type into your editor
- Arithmetic expressions evaluated at compile time
Example
|
1
2
3
|
#define Fosc 4000000#define Tcy (4 * (1/Fosc))#define Setup InitSystem(Fosc, 250, 0x5A) |
Argument Macros
Syntax
#define label(arg1,…, argn) code
- The code must fit on a single line or use "\" to split lines
- Text substitution used to insert arguments into code
- Each instance of the label() will be expanded into code
- This is not the same as a C function
Example
|
1
2
3
|
#define min(x, y) ((x)<(y)?(x):(y))#define square(x) ((x)*(x))#define swap(x, y) { x ^= y; y ^= x; x ^= y; } |
Extreme care must be exercised when using macros. Consider the following use of the below macro:
|
1
|
#define square(a) ((a)*(a)) |
|
1
2
|
i = 5;x = square(i++); |
The result will be the following:
x = 30
i = 7
Wrong Answers!
x = square(i++);
expands to:
x = ((i++)*(i++));
So i gets incremented twice, not once at the end as expected.