1 / 6

Defining Macros with Parameters

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)). Program Using a Macro with Parameters.

ave
Télécharger la présentation

Defining Macros with Parameters

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  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. Program Using a Macro with Parameters /* Shows the definition and use of a macro */ #include <stdio.h> #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

  3. Macro Expansion LABEL_PRINT_INT(“tiger”, t+2) Second macro call in the main LABEL_PRINT_INT(label, num) Parameter matching: tiger t+2 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]);

More Related