• No results found

Chapter 13 - The Preprocessor

N/A
N/A
Protected

Academic year: 2021

Share "Chapter 13 - The Preprocessor"

Copied!
10
0
0

Loading.... (view fulltext now)

Full text

(1)

© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.

Chapter 13 - The Preprocessor

Outline

13.1 Introduction

13.2 The#include Preprocessor Directive

13.3 The#define Preprocessor Directive: Symbolic Constants 13.4 The#define Preprocessor Directive: Macros

13.5 Conditional Compilation

13.6 The#error and #pragma Preprocessor Directives 13.7 The# and ## Operators

13.8 Line Numbers

13.9 Predefined Symbolic Constants 13.10 Assertions

Objectives

•In this chapter, you will learn:

–To be able to use #includefor developing large programs.

–To be able to use #defineto create macros and macros with arguments.

–To understand conditional compilation.

–To be able to display error messages during conditional compilation.

–To be able to use assertions to test if the values of expressions are correct.

(2)

© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.

13.1 Introduction

•Preprocessing

–Occursbeforea 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 編譯前指示

13.2 The

#include

Preprocessor Directive

•#include

–Copy of a specified file included in place of the directive

– #include <filename>

•Used to include standard library headers such as stdio.h

•Header file –has common declarations and definitions (classes, structures, function prototypes)

– #include "filename"

•Searches current directory, then standard library

•Use to include programmer-defined headers

•Can also be used to include other source files to be compiled together (not recommended)

(3)

© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.

13.3 The

#define

Preprocessor Directive:

Symbolic Constants

•#define

–used to create symbolic constants and macros –Symbolic constants

•When program compiled, all occurrences of symbolic constant are replaced with replacement text

–Format

#defineidentifier replacement-text –Example:

#define PI 3.14159

–Everything to right of identifier replaces text

#define PI = 3.14159

•Replaces “PI”with "= 3.14159"

–Cannot redefine symbolic constants once they have been created

13.4 The #define Preprocessor Directive:

Macros

•Macro (巨集)

–Operation defined in

#define

–A macro without arguments is treated like a symbolic constant

–A macro with arguments has its arguments substituted for replacement text, when the macro is expanded

–Performs a text substitution –no data type

checking

(4)

© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.

Macro Example

The macro

#define CIRCLE_AREA( x ) ( PI * ( x ) * ( x ) )

would cause

area = CIRCLE_AREA( 4 );

to become

area = ( 3.14159 * ( 4 ) * ( 4 ) );

Use Parenthesis

If the parentheses around each x is omitted:

#define CIRCLE_AREA( x ) (PI * x * x )

the macro would cause

area = CIRCLE_AREA( c + 2 );

to become

area = 3.14159 * c + 2 * c + 2;

(5)

© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.

Macro: Multiple Arguments

#define RECTANGLE_AREA( x, y ) ( ( x ) * ( y ) )

would cause

rectArea = RECTANGLE_AREA( a + 4, b + 7 );

to become

rectArea = ( ( a + 4 ) * ( b + 7 ) );

Preprocessor Directive: #undef

•#undef

–Undefines a symbolic constant or macro –If a symbolic constant or macro has been

undefined it can later be redefined

(6)

© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.

13.5 Conditional Compilation

•Conditional compilation (條件式編譯)

–Control preprocessor directives and

compilation

•A conditional preprocessor directive evaluate a constant integer expression

–The expression

cannot

include variables, cast expressions,

sizeof, and

enumeration constants

條件式編譯前指示

Conditional Preprocessor Construct

–Structure similar toif

#if !defined( NULL )

#define NULL 0

#endif

•Determines if symbolic constantNULLhas been defined –IfNULLis defined,defined( NULL )evaluates to1 –IfNULLis not defined, this function definesNULLto be

0

–Every#ifmust end with#endif

– #ifdefshort for#if defined( name ) – #ifndefshort for#if !defined( name )

(7)

© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.

13.5 Conditional Compilation

•Other statements

– #elif–equivalent ofelse ifin anifstatement – #else–equivalent ofelsein anifstatement

•"Comment out" code

–If the code contains comments, cannot use/* ...

*/

–Use

#if 0

code commented out

#endif

–To enable code, change0to1

13.5 Conditional Compilation

•Debugging

#define DEBUG 1

#ifdef DEBUG

printf(“Variable x = %d\n”, x);

#endif

–Defining DEBUGto1 enables code

–After code corrected, remove#definestatement –Debugging statements are now ignored

(8)

© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.

13.6 The

#error

and

#pragma

Preprocessor Directives

•#errortokens

–Tokens are sequences of characters separated by spaces (和字串不同的是tokens沒有前後的引號)

•I like C++has3tokens

–Displays a message including the specified tokens as an error message

–Stops preprocessing and prevents program compilation

•#pragma tokens

–Implementation defined action (consult compiler documentation)

–Pragmas not recognized by compiler are ignored

13.7 The

#

and

##

Operators

•#

–Causes a replacement text token to be converted to a string surrounded by quotes (將token加上前後引號變成字串) –The statement

#define HELLO( x ) printf( “Hello, ” #x “\n” );

would cause

HELLO( John )

to become

printf( “Hello, ” “John” “\n” );

–Strings separated by whitespace are concatenated when usingprintf

(9)

© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.

13.7 The

#

and

##

Operators

•##

–Concatenates two tokens –The statement

#define TOKENCONCAT( x, y ) x ## y

would cause

TOKENCONCAT( O, K )

to become

OK

13.8 Line Numbers

•#line

–Renumbers subsequent code lines, starting with integer value

–File name can be included –#line 100 "myFile.c"

•Lines are numbered from100beginning with next source code line

•Compiler messages will think that the error occurred in"myfile.C"

•Makes errors more meaningful

•Line numbers do not appear in source file

(10)

© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.

13.9 Predefined Symbolic Constants

•Four predefined symbolic constants

–Cannot be used in#defineor#undef

Symbolic constant Description

__LINE__ The line number of the current source code line (an integer constant).

__FILE__ The presumed name of the source file (a string).

__DATE__ The date the source file is compiled (a string of the form"Mmm dd yyyy"such as"Jan 19 2001").

__TIME__ The time the source file is compiled (a string literal of the form"hh:mm:ss").

13.10 Assertions

•The assert

macro

–Defined in header file <assert.h>

–Tests value of an expression

–If0 (false)prints error message and callsabort –Example:

assert( x <= 10 );

–IfNDEBUGis defined

•All subsequent assert statements ignored

#define NDEBUG

References

Related documents

A close association of body cell mass loss with disease activity and disability in Chinese patients with rheumatoid arthritis.. Yi-Ming Chen, I,II,III Hsin-Hua Chen, I,III,IV

CARRIED UNANIMOUSLY MOVED BY Councillor Duncan that the minutes of the Organizational Council Meeting of October 29,.. 2013 be adopted

Two players, A and B, play the game of matching pennies: at each time n, each player has a penny and must secretly turn the penny to heads or tails.. The players then reveal

Description: This Market Update examines the private healthcare market in the UK, encompassing a number of medical treatments and services provided by the private sector..

b) Scalability: Each tenant of a vSDN could use its own controller to manage its vSDN topology. A hypervisor architecture for a virtualized infrastructure should provide a high

Aachen Adana Agrigento Alicante Amsterdam Ankara Athina Bakı Bamberg Banja Luka Barcelona Bari Beograd Bergamo Berlin Bialystok Bihać Bilbao Bologna Bratislava Brescia

This thesis inves gates the poten al eff ects of a 7.2 magnitude earthquake in San Francisco City, par cularly the implica ons on San Francisco’s residen al housing stock

Forward-looking statements include, but are not limited to statements about (i) the plans for, including timing and progress of, clinical development, clinical trials