Difficulty: Easy
Correct Answer: multiply
Explanation:
Introduction / Context:
This checks knowledge of macro stringification and why a two-level macro is needed to stringify another macro’s replacement text instead of its name. It is a classic pattern used in build-time banners and generated identifiers.
Given Data / Assumptions:
#define oper multiply
(token replacement)#define str(x) #x
and #define Xstr(x) str(x)
opername
with printf
.
Concept / Approach:
Single-level stringification str(oper)
would yield the literal "oper"
. However, two-level expansion Xstr(oper)
first expands oper
to multiply
, then stringifies to "multiply"
. Therefore, the program prints multiply
(without quotes).
Step-by-Step Solution:
Xstr(oper) → str(oper)
.Before applying #
, inner argument expands: oper → multiply
.Stringify: str(multiply) → "multiply"
.Prints: multiply
.
Verification / Alternative check:
Change oper
to divide
and recompile; you will see divide
printed, proving two-step expansion occurs.
Why Other Options Are Wrong:
"oper"
would happen if you used str(oper)
directly.
Common Pitfalls:
Expecting #
to expand its argument before stringifying; it does not without the two-level trick.
Final Answer:
multiply.
Discussion & Comments