Chapter 14: Review Questions
T F 1. Preprocessing directives are evaluated before
language keywords.
T F 2. One macro cannot be used to help define
another.
T F 3. Every macro parameter occurrence in the macro
body should be surrounded by parenthesis.
T F 4. The backslash is needed to continue the
definition of a macro to another line.
T F 5. It is required that defined constant names be
in uppercase.
T F 6. The # operator creates a character
pointer whose name is that of the macro
argument.
T F 7. Arithmetic expressions in a macro should be
surrounded by parentheses, even if that means
enclosing the entire macro body.
T F 8. The #define directive is used to create
both simple replacement and function-like
macros.
T F 9. The #line directive allows for the
setting of the __DATE__ and
__TIME__ macros.
T F 10. The #error directive allows for the
output of a message to stdout when a runtime
error is encountered.
T F 11. The preprocessor has been a part of C from
the inception of the language.
T F 12. Preprocessing directives are evaluated before C
language keywords like while,
for, or if.
T F 13. It is appropriate to think of the preprocessor
as a smart text editor.
T F 14. One macro cannot be used to help define
another.
T F 15. The #define directive is used to create
both simple replacement and function-like
macros.
T F 16. Macro parameters have data types, just like
function parameters.
T F 17. Every macro parameter occurrence in the macro
body should be surrounded by parentheses.
T F 18. The backslash is needed to continue the
definition of a macro to another line.
T F 19. It is required that macro names be in
uppercase.
T F 20. Without #undef it is impossible to
redefine a macro.
T F 21. The #if defined directive requires that
the identifier being examined not only be
defined, but also have at least a space for a
value.
T F 22. The #if and related directives can be
nested.
T F 23. The # operator creates a character
pointer whose name is that of the macro
argument.
T F 24. The concatenation operator can be used to
dynamically build both macro and variable
names.
T F 25. The preprocessor helps you debug your C cyntax.
T F 26. All macros must be defined in your program.
T F 27. Conditional compilation can help you move your
program to new environments while retaining one
set of base code.
T F 28. Assigning a macro name to string literals make
changing your program easier.
T F 29. If a compiler already has a macro called
min, we would have problems creating a
MIN macro to be used together with
min.
T F 30. Arithmetic expressions in a macro should be
surrounded by parentheses, even if that means
enclosing the entire macro body.
31. A macro, compared to its equivalent function
implementation, is generally:
a. More complicated
b. Faster in execution speed.
c. Coded from a different algorithm.
d. None of the above.
e. All of the above.
32. What is wrong with the following macro?
#define TRUE 1
#define FALSE 0
#define TEST(bin,bit) bin & bit ? TRUE : FALSE
(Assume that bin is a binary number and
bit is the bit to be tested.)
a. The type bin is not valie in C.
b. The macro will always return TRUE.
c. Side effects may arise in the expansion.
d. TRUE and FALSE will not be expaned to TEST.
33. One use for the #ifdef proprocessor directive
could be:
a. Building applications that can be used in
different operating system environments.
b. Nesting one function within another.
c. Dynamic memory allocation within a macro.
d. None of the above.
34. What is wrong with the code fragment given below?
#define SQUARE(x) ((x) * (x))
...
/* produce a table of squares from 1 to 10 */
int i = 0;
while( i <= 10 )
printf("%d squared = %d\n", SQUARE(++i) );
...
a. The loop will not terminate because ++i
will not be evaluated in the macro expansion.
b. The macro expansion will introduce side effects,
resulting in an incorrect table of squares.
c. The increment operator cannot be used in a macro.
d. The macro argument x cannot be used more
than once in the macro definition. A compile
error will be the result.
35. Which statement is not true when applied to the
#if family of preprocessor directives?
a. They can be nested.
b. They can be used as functionally equivalent to the
C construct if/else.
c. They are always evaluated before compilation takes
place.
d. The #else, if present, is always associated
with the closest preceding #if directive.
36. The predefined macros __DATE__ and
__TIME__ are useful because
a. They can be used to reset the system date and/or
time.
b. They are difficult (impossible?) to retrieve by
other methods.
c. They can be used to dynamically retrieve the
current date/time at runtime.
d. None of the above.
37. What is wrong with the following code fragment?
#define IBM
#if defined(IBM)
# define MAX_INT 16
#elif defined(MACINTOSH)
# define MAX_INT 32
#else defined(ATARI800)
# define MAX_INT 8
...
printf("Maximum integer is %d\n", MAX_INT );
a. There is no #endif directive.
b. IBM has no value.
c. The define directives cannot be indented.
d. MAX_INT would be undefined, which would
produce a compile error.
e. All of the above.
f. None of the above.