What is the # for when formatting using %s

2019-05-02 11:17发布

I came across this example of an assertion and was wondering what the # is for:

#define ASSERT( x ) if ( !( x ) ) { \
    int *p = NULL; \
    DBGPRINTF("Assert failed: [%s]\r\n Halting.", #x); \
    *p=1; \
  } 

7条回答
何必那么认真
2楼-- · 2019-05-02 11:22

It is the "stringize" preprocessing operator.

It takes the tokens passed as the argument to the macro parameter x and turns them into a string literal.

#define ASSERT(x) #x

ASSERT(a b c d)
// is replaced by
"a b c d"
查看更多
Bombasti
4楼-- · 2019-05-02 11:23

It's a preprocessor feature called stringification. It

replaces [the macro parameter] with the literal text of the actual argument, converted to a string constant.

查看更多
劫难
5楼-- · 2019-05-02 11:26

# is the preprocessor's "stringizing" operator. It turns macro parameters into string literals. If you called ASSERT(foo >= 32) the #x is expanded to "foo >= 32" during evaluation of the macro.

查看更多
你好瞎i
6楼-- · 2019-05-02 11:37

#x is the stringification directive

#define Stringify(x) #x

means Stringify(abc) will be substituted with "abc"

as in

#define initVarWithItsOwnName(x) const char* p = #x

int main()
{
   initVarWithItsOwnName(Var);
   std::cout << Var; //will print Var
}
查看更多
SAY GOODBYE
7楼-- · 2019-05-02 11:47

# is the stringizing operator defined in Section 6.10.3.2 (C99) and in Section 16.3.2. (C++03)

It converts macro parameters to string literals without expanding the parameter definition.

If the replacement that results is not a valid character string literal, the behavior is undefined. The order of evaluation of # operator is unspecified.

For instance, syntactically, occurrences of the backslash character in string literals are limited to escape sequences.

In the following example:

1        #define  mkstr(x)  #  x
2        char  *p  =  mkstr(a  \  b);  
       /*  "a  \  b"  violates  the  syntax  of  string  literals  */

the result of the # operator need not be "a \ b".

查看更多
登录 后发表回答