|
1
|
- Yongjoon Lee
- April 22, 2005
|
|
2
|
- Things with #
- Processes the C source files BEFORE handing it to compiler.
|
|
3
|
- File Inclusion
- Basic Macros
- Parameterized Macros
- Conditional Compilation
- Style and (mis)use of Macros
|
|
4
|
- Recall : #include <filename>
- #include <foo.h>
- #include ¡°foo.h¡±
- gcc -I
|
|
5
|
- 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))
|
|
6
|
- 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
|
|
7
|
- Want to wrap malloc() calls.
- YES!
- #define NEW_T(t,sz)
- ((t*) malloc((sz)*sizeof(t))
|
|
8
|
- 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};
|
|
9
|
- #if
- #ifdef
- #ifndef
- #elif
- #else
- #endif
|
|
10
|
- Debugging
- #define DEBUG_MODE
- #ifdef DEBUG_MODE
- #endif
- OS/Platform
- #ifdef _WIN32
- #include <windows.h>
- #elif
- /* ¡¦¡¦ */
|
|
11
|
- File header
- #ifndef FOO_H
- #define FOO_H
- /* ¡¦ the whole file ¡¦ *
- #endif
- Why???
- Global variables
- Cycles of includes
- Inefficient
|
|
12
|
- Yongjoon Lee
- April 22, 2005
|
|
13
|
- 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
|
|
14
|
- Padding ( width )
- Precision
- Left/right justification
- Similar in %f, %e, ¡¦ conversions
|
|
15
|
- %c has only precision 1
- Precision in %s means string length
- starting from the beginning
- Padding and justification are same
|