What does #x inside a C macro mean?

前端 未结 4 1779
死守一世寂寞
死守一世寂寞 2020-11-27 03:03

For example I have a macro:

#define PRINT(int) printf(#int \"%d\\n\",int)

I kinda know what is the result. But how come #int repersent the

相关标签:
4条回答
  • 2020-11-27 03:45

    In this context (applied to a parameter reference in a macro definition), the pound sign means to expand this parameter to the literal text of the argument that was passed to the macro.

    In this case, if you call PRINT(5) the macro expansion will be printf("5" "%d\n", 5); which will print 5 5; not very useful; however if you call PRINT(5+5) the macro expansion will be printf("5+5" "%d\n", 5+5); which will print 5+5 10, a little less trivial.

    This very example is explained in this tutorial on the C preprocessor (which, incidentally, is the first Google hit for c macro pound sign).

    0 讨论(0)
  • 2020-11-27 03:51

    "#" can show the name of a variable, it's better to define the macro as this:

    #define PRINT(i) printf(#i " = %d\n", i)
    

    and use it like this:

    int i = 5;
    PRINT(i);
    

    Result shown:

    i = 5
    
    0 讨论(0)
  • 2020-11-27 03:53

    That is a bad choice of name for the macro parameter, but harmless (thanks dreamlax).

    Basically if i write like so

    PRINT(5);
    

    It will be replaced as

    printf("5" "%d\n",5);
    

    or

    printf("5 %d\n",5);
    

    It is a process called Stringification, #int is replaced with a string consisting of its content, 5 -> "5"

    0 讨论(0)
  • 2020-11-27 03:54

    '#' is called a stringize operator. Stringize operator puts quotes around the parameter passed and returns a string. It is only used in a marco statements that take the arguments.

    #include<stdio.h> 
    
    #define stringLiteral(sl) #sl
    
    int main()
    {
       char StringizeOpreator = 'a'; 
       printf(stringLiteral(StringizeOpreator));
       return 0;
    }
    

    Here the 'stringLiteral' marco takes the formal argument sl and returns #sl. Actual argument passed is 'StringizeOpreator'. The return statement '#sl' has '#' operator, that puts quotes around the argument like '"StringizeOpreator"' and returns a string.

    So the output of the above program is the name of the actual parameter 'StringizeOpreator' rather than the value stored in the actual parameter passed.

    To learn more visit this link: Stringize Operator

    0 讨论(0)
提交回复
热议问题