What's the difference between the macros “#define STR(x) #x” and “#define STR(x) VAL(x)” with “#defineVAL(x) #x”?

后端 未结 2 426
抹茶落季
抹茶落季 2020-12-17 10:17

When I use this code:

#include 
#define STR(x) #x

int main(void)
{
    printf(__FILE__ STR(__LINE__) \"hello!\\n\");
    return 0;
}
<         


        
2条回答
  •  执念已碎
    2020-12-17 10:37

    Arguments to macros are themselves macro-expanded, except where the macro argument name appears in the macro body with the stringifier # or the token-paster ##.

    In the first case, the argument of STR is not macro-expanded, and so you just get the name of the LINE macro.

    In the second case, the argument of STR is macro-expanded when it is substituted into the definition of VAL, and so it works -- you get the actual line number because the LINE macro is expanded.

提交回复
热议问题