I want to know the reason behind the output of this code. I couldn't come up with an answer.
#define f(a,b) a##b
#define g(a) #a
#define h(a) g(a)
void main()
{
printf("%s %s",h(f(1,2)),g(f(1,2)));
}
PS: output is 12 f(1,2)
. I thought it was 12 12
or f(1,2) f(1,2)
.
Macro: a word defined by the #define preprocessor directive that evaluates to some other expression. Preprocessor directive: a special #-keyword, recognized by the preprocessor. Show activity on this post. preprocessor modifies the source file before handing it over the compiler.
Macros allow you to write commonly used PL/I code in a way that hides implementation details and the data that is manipulated and exposes only the operations. In contrast with a generalized subroutine, macros allow generation of only the code that is needed for each individual use.
Identifiers that represent statements or expressions are called macros. In this preprocessor documentation, only the term "macro" is used. When the name of a macro is recognized in the program source text, or in the arguments of certain other preprocessor commands, it's treated as a call to that macro.
Explanation: True, After preprocessing all the macro in the program are removed.
h(f(1,2))
f(1,2)
is substituted for a
. a
is not the subject of a #
or ##
operator so it's expanded to 12
. Now you have g(12)
which expands to "12"
.
g(f(1,2))
f(1,2)
is substituted for a
. The #
operator applied to a
prevents macro expansion, so the result is literally "f(1,2)"
.
Just do the replacements.
h(f(1, 2)) -> g(12) -> "12"
g(f(1,2)) -> "f(1, 2)"
You should also see here.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With