From 9cea2d56a535125af490a13146a1598b0b2419ba Mon Sep 17 00:00:00 2001 From: jagmeethanspal Date: Sun, 25 Nov 2018 06:03:39 +0530 Subject: [PATCH] Added Special Operators in Macros (#22514) One small fix and the explanation of Stringizing and Token Pasting Operators that can be used effectively in C macros. --- guide/english/c/macros/index.md | 50 ++++++++++++++++++++++++++++----- 1 file changed, 43 insertions(+), 7 deletions(-) diff --git a/guide/english/c/macros/index.md b/guide/english/c/macros/index.md index bab53bac5d..1dc08538e8 100644 --- a/guide/english/c/macros/index.md +++ b/guide/english/c/macros/index.md @@ -31,30 +31,66 @@ Function-like uses the same `#define` keyword. The difference is that you use a ```C #define hello_world() printf("Hello World!") ``` + So calling: ```C -hello_world() +hello_world(); ``` + You get: ```C printf("Hello World!"); ``` + You can set parameters too: ```C #define hello(X) printf("Hello " X "!") ``` + Now calling: ```C hello("World"); ``` + You get the equivalent of: ```C 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. +```C +#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 +```C +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. +```C +#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 +} +``` + #### More Information: - -[GCC Online Documentation: Macros](https://gcc.gnu.org/onlinedocs/cpp/Macros.html) - -[GCC Online Documentation: Object-like macros](https://gcc.gnu.org/onlinedocs/cpp/Object-like-Macros.html#Object-like-Macros) - -[GCC Online Documentation: Function-like macros](https://gcc.gnu.org/onlinedocs/cpp/Function-like-Macros.html#Function-like-Macros) +- [GCC Online Documentation: Macros](https://gcc.gnu.org/onlinedocs/cpp/Macros.html) +- [GCC Online Documentation: Object-like macros](https://gcc.gnu.org/onlinedocs/cpp/Object-like-Macros.html#Object-like-Macros) +- [GCC Online Documentation: Function-like macros](https://gcc.gnu.org/onlinedocs/cpp/Function-like-Macros.html#Function-like-Macros)