When I use this code:
#include
#define STR(x) #x
int main(void)
{
printf(__FILE__ STR(__LINE__) \"hello!\\n\");
return 0;
}
<
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.