In C, macros can be defined using the "#define" preprocessor directive. The macro definition can span multiple lines by using a backslash () at the end of each line to indicate that the definition continues on the next line.
For example:
It's important to note that using a backslash at the end of a line in this way does not insert a newline character into the macro definition.
Additionally, it's a common practice to add a trailing do {...} while(0) idiom to multiline macros to prevent accidental misuse, where the macro could be used in places where the semantic is different from what was intended, such as if-else statements or loops.
It's worth mentioning that In C++11 and later, you can use '' in the last line of macro definition and it is not required to use 'do {...} while(0)', but for backwards compatibility with C, it's still a good practice to use it.
When a macro is defined with a semicolon at the end, and the macro is used in an "if-else" statement, the semicolon is included in the macro expansion and becomes part of the generated code. This results in a syntax error, as there is an extra semicolon between the "if" and "else" statements.
To avoid this problem, it is recommended to not include a semicolon at the end of a macro definition, and instead use the do {...} while (0) idiom. This idiom causes the macro to be treated as a single statement and eliminates the need for a semicolon at the end of the macro definition.
The "do-while(0)" idiom is used to enclose a macro in a loop, with the condition "while(0)" at the end. This causes the loop to execute only once and is used to treat the macro as a single statement.
The purpose of enclosing the macro in a loop, even though the loop will execute only once, is to make the macro behave like a single statement. This way, when the macro is expanded in an "if-else" statement or other control flow statements, it will not be expanded with an extra semicolon, and the program will not generate a compilation error.
We can enclose a multi-line macro in parenthesis to overcome the limitation of having a semicolon at the end of a macro definition when the macro is used in an "if-else" statement or other control flow statements.
When a macro is enclosed in parenthesis, it is treated as a single statement by the compiler. This eliminates the need for a semicolon at the end of the macro definition and prevents the macro from being expanded with an extra semicolon when used in an "if-else" statement or other control flow statements.
Here's an example:
This way, when the macro is expanded in an "if-else" statement, the semicolon is not added, and the program will not generate a compilation error, since the parenthesis causes the macro to be treated as a single statement.