Download presentation
Presentation is loading. Please wait.
Published byOphelia Day Modified over 9 years ago
1
Defining Macros with Parameters Defining constant macro # define macro_name value For example: # define KMS_PER_MILE 1.609 Defining macro with parameters # define macro_name(parameter lis) macro body For example: # define SQUARE(n) ((n) * (n))
2
/* Shows the definition and use of a macro*/ #include #define LABEL_PRINT_INT(label, num) \ printf("%s = %d", (label), (num)) int main(void) { int r = 5, t = 12; LABEL_PRINT_INT("rabbit", r); printf(" "); LABEL_PRINT_INT("tiger", t + 2); printf("\n"); return(0); } rabbit = 5 tiger = 14 Program Using a Macro with Parameters
3
Macro Expansion LABEL_PRINT_INT(“tiger”, t+2) Second macro call in the main LABEL_PRINT_INT(label, num) LABEL_PRINT_INT(label, num) Parameter matching: tiger t+2 printf(“%s = %d”, (label), (num)) printf(“%s = %d”, (label), (num)) parameter replacement in body printf(“%s = %d”, (“tiger”), (t+2))
4
Rules for Defining Macros with parameters Same as constant macro there is no “;” at the end of macro definition To extend a macro over multiple lines, all except for the last line must end with backslash character “/” Operators with side effect should not be used as macro arguments. For example #define RT(++a) is wrong
5
Rules for Defining Macros with parameters Using the parenthesis for the formal parameters in Macro body is required to avoid the effect of operator precedence in macro expansion. For example: Version 1 Version 2 #define SQUARE(n) n * n #define SQUARE(n) ((n) * (n)) SQUARE(x + y) SQUARE(x + y) becomes becomes x + y * x + y ((x + y) * (x + y)) Problem: multiplication done before addition in version 1, also. SQUARE(m) / SQUARE(n) SQUARE(m) / SQUARE(n) becomes becomes m * m / n * n ((m) * (m)) / ((n) * (n)) Therefore, the result produced by version 1 is wrong
6
More examples of Macro with Parameters # define ROOT1(a, b, c) \ ((-(b) + sqrt((b) * (b) – 4 * (a) * (c))) / (2 * (a))) Can be used in the main as r = ROOT1(n1, n2, n3); # define INDEXED-FOR(ct, st, end) \ for ((ct) = (st); (ct) < (end); ++(ct)) Can be used in the main as INDEXED_FOR(i,0,X_MAX) printf( “ x[%2d] = %6.2f\n ”, i, x[i]);
Similar presentations
© 2025 SlidePlayer.com Inc.
All rights reserved.