2.7 KiB
title |
---|
Macros in C |
Macros in C
A macro is a piece of code with a given name. When the name is used, it is replaced by the content of the macro. The #define
keyword is used to define new macros. It's followed by a name and a content. By convention, macro names are written in uppercase. There are two type of macros: Object-like
macros and Function-like
macros.
Object-like Macros
#define PI 3.14
If you use the macro this way:
printf("Value of PI: %d", PI);
Is the same as write this:
printf("Value of PI: %d", 3.14);
Undefining Macros
After defining macros you can also undefine them at any point. just Type
#undefine PI
This is used to use macros only for specific lines of code and again undefine it.
Function-like Macros
Function-like uses the same #define
keyword. The difference is that you use a pair of parentheses after the function name.
#define hello_world() printf("Hello World!")
So calling:
hello_world();
You get:
printf("Hello World!");
You can set parameters too:
#define hello(X) printf("Hello " X "!")
Now calling:
hello("World");
You get the equivalent of:
printf("Hello World!");
Special Operators in Macros
One can use the special operators # (stringize) and ## (concatenate) in macros for achieving unique functionality.
Stringizing Operator (#)
A macro's parameter preceded by a #
is converted and treated as a string token.
For example, we can define ERROR and WARN macros that print a LOG message.
While the LOG message gets prefixed with either an ERR
or a WARN
, respectively.
#define LOG(level, message) printf(#level ": " #message "\n")
#define ERROR(msg) LOG(FAIL, msg)
#define WARN(msg) LOG(WARN, msg)
Now, one can use it as
ERROR(Invalid settings); // Output-> FAIL: Invalid settings
WARN(Upper threshold); // Output-> WARN: Upper threshold
Concatenation (or token-pasting) Operator (##)
Using concatenation the parameters can be joined together to form one single token. Token-pasting is much more powerful in the sense that the resulting token could be an object defined in the C program.
#define NUM(x) number_##x
void foo() {
int number_one = 10;
int number_two = 15;
printf("%d + %d = %d\n", NUM(one), NUM(two), NUM(one) + NUM(two));
// Output-> 10 + 15 = 25
}