PSPC Unit IVb Preprocessors
PSPC Unit IVb Preprocessors
Preprocessors in C
Outline
• Introduction
• The #include Preprocessor Directive
• The #define Preprocessor Directive: Symbolic Constants
• The #define Preprocessor Directive: Macros
• Conditional Compilation
• The # and ## Operators
Introduction
• Preprocessing
– Occurs before a program is compiled
– Inclusion of other files
– Definition of symbolic constants and macros
– Conditional compilation of program code
– Conditional execution of preprocessor directives
• Format of preprocessor directives
– Lines begin with #
– Only whitespace characters before directives on
a line
• #define
– Preprocessor directive used to create symbolic constants and
macros.
• Symbolic constants
– When program compiled, all occurrences of symbolic constant
replaced with replacement text
• Format
#define identifier replacement-text
– Example: #define PI 3.14159
– everything to right of identifier replaces text
#define PI = 3.14159
• replaces "PI" with " = 3.14159", probably results in an error
– Cannot redefine symbolic constants with more #define
statements
• Macro
– Operation defined in #define
– Macro without arguments: treated like a symbolic
constant
– Macro with arguments: arguments substituted for
replacement text, macro expanded
– Performs a text substitution - no data type checking
Example:
#define CIRCLE_AREA( x ) ( (PI) * ( x ) * ( x ) )
area = CIRCLE_AREA( 4 );
is expanded to
area = ( 3.14159 * ( 4 ) * ( 4 ) );
• Use parenthesis
– Without them:
#define CIRCLE_AREA( x ) ((PI) * ( x ) * ( x ))
#define CIRCLE_AREA( x ) PI * x * x
area = CIRCLE_AREA( c + 2 );
becomes
area = 3.14159 * c + 2 * c + 2;
• Evaluates incorrectly
• Macor’s advantage is that avoiding function overhead
– Macro inserts code directly.
• Macro’s disadvantage is that its argument may be evaluated
more than once.
• Multiple arguments
#define RECTANGLE_AREA( x, y ) ( ( x ) *
( y ) )
rectArea = RECTANGLE_AREA( a + 4, b + 7 );
becomes
rectArea = ( ( a + 4 ) * ( b + 7 ) );
• #undef
– Undefines a symbolic constant or macro, which
can later be redefined
10
Conditional Compilation
• Conditional compilation
– Control preprocessor directives and compilation
– Cast expressions, sizeof, enumeration constants
cannot be evaluated
• Structure similar to if
#if !defined( NULL )
#define NULL 0
#endif
– Determines if symbolic constant NULL defined
• If NULL is defined, defined(NULL) evaluates to 1
• If NULL not defined, defines NULL as 0
– Every #if ends with #endif
– #ifdef short for #if defined(name)
– #ifndef short for #if !defined(name)
11
• Other statements
#elif - equivalent of else if in an if
structure
#else - equivalent of else in an if structure
12
• #
– Replacement text token converted to string with quotes
#define HELLO( x ) printf (“ Hello, “ #x “\n”);
HELLO(John) Notice #
becomes
printf (“ Hello, “ “John” “\n”);
printf (“ Hello, John\n”);
• ##
– Concatenates two tokens
• Strings separated by whitespace are concatenated
#define TOKENCONCAT( x, y ) x ## y
TOKENCONCAT( O, K )
becomes
OK
13
THANKS
14