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.