Micron Document
The C Programming Language, Ansi C


← Prev · 101/277 · Next →

the macro is expanded into

printf("x/y" " = &g;n", x/y);

and the strings are concatenated, so the effect is

printf("x/y = &g;n", x/y);

Within the actual argument, each

"

is replaced by

"

and each



by

\

, so the result is a legal string constant.

The preprocessor operator ## provides a way to concatenate actual arguments during macro expansion. If a parameter in the replacement text is adjacent to a ##, the parameter is replaced by the actual argument, the ## and surrounding white space are removed, and the result is re-scanned. For example, the macro paste concatenates its two arguments:


so

paste(name, 1)

creates the token

name1

.

The rules for nested uses of ## are arcane; further details may be found in Appendix A.

Exercise 4-14. Define a macro swap(t,x,y) that interchanges two arguments of type t. (Block structure will help.)

It is possible to control preprocessing itself with conditional statements
that are evaluated during preprocessing. This provides a way to include code
selectively, depending on the value of conditions evaluated during compilation.

The #if line evaluates a constant integer expression (which may not include sizeof, casts, or enum constants). If the expression is non-zero, subsequent lines until an #endif or #elif or #else are included. (The preprocessor statement #elif is like else-if.) The expression defined(name) in a #if is 1 if the name has been defined, and 0 otherwise.

For example, to make sure that the contents of a file hdr.h are included only once, the contents of the file are surrounded with a conditional like this:

#define HDR

/* contents of hdr.h go here */

#endif

The first inclusion of

hdr.h

defines the name

HDR

; subsequent
inclusions will find the name defined and skip down to the


. A
similar style can be used to avoid including files multiple times. If this
style is used consistently, then each header can itself include any other
headers on which it depends, without the user of the header having to deal with
the interdependence.