150 likes | 170 Views
Learn about the C Preprocessor, its functions, and how it processes C source files before compilation. Explore file inclusion, macros, conditional compilation, and the appropriate use of macros.
E N D
The C Preprocessor Yongjoon Lee April 22, 2005
What is it? • Things with # • #include <stdio.h> • Processes the C source files BEFORE handing it to compiler. • `Pre`-process • gcc –E • cpp
Why care? • File Inclusion • Basic Macros • Parameterized Macros • Conditional Compilation • Style and (mis)use of Macros
File Inclusion • Recall : #include <filename> • #include <foo.h> • System directories • #include “foo.h” • Current directories • gcc -I
Macros • We can #define constants #define HALF_PI 1.5708 #define BAD_PI HALF_PI+HALF_PI • Solution? ((((((((((The parentheses!)))))))))) #define PI ((HALF_PI)+(HALF_PI))
Parameterized Macros • Macros with param : #define BAAAD_DOUBLE(x) (x*2) #define BAD_DOUBLE(x) ((x)+(x)) #define OKAY_DOUBLE(x) ((x)*2) • WHAT TO TAKE HOME: • Don’t use 2+ parameters. • No assignments within macro
Parameterized Macros cont’d • Want to wrap malloc() calls. • Can we? • YES! #define NEW_T(t,sz) ((t*) malloc((sz)*sizeof(t))
Appropriate use of Macros • Do • Use parentheses • Handle header file inclusion • Capitalize macro names • Don’t • Use more than 2 parameters. • Replace function calls with macros for ‘performance’ • Make the code harder to read#define LOOP(s) while(1) {s};
Conditional Inclusion • #if • #ifdef • #ifndef • #elif • #else • #endif
Conditional Compilation • Debugging #define DEBUG_MODE #ifdef DEBUG_MODE /* … Debug code … */ #endif • OS/Platform #ifdef _WIN32 #include <windows.h> #elif /* …… */
File Header • File header • #ifndef FOO_H #define FOO_H /* … the whole file … * #endif • Why??? • Global variables • Cycles of includes • Inefficient
The Printf Yongjoon Lee April 22, 2005
Basics • printf(“format string”,vars); • Format string? • “This year is %d\n” • “Your score is %d\n” • Conversion by % • %d : int • %f : float, double • %c : char • %s : char *, string • %e : float, double in scientific form
Examples %d conversion • Padding ( width ) %12d %012d • Precision %12.4d %12.6d • Left/right justification %12d %-12d • Similar in %f, %e, … conversions
Example %c, %s conversion • %c has only precision 1 • Precision in %s means string length starting from the beginning • Padding and justification are same