开发者

What is the # for when formatting using %s

开发者 https://www.devze.com 2023-02-18 12:28 出处:网络
I came across this example of an asse开发者_如何学Gortion and was wondering what the # is for: #define ASSERT( x ) if ( !( x ) ) { \\

I came across this example of an asse开发者_如何学Gortion 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; \
  } 


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"


#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
}


# 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.


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.


# 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".


It's the stringizing operator.

http://msdn.microsoft.com/en-us/library/7e3a913x(v=vs.80).aspx


What you see is called stringification. It allows you to convert an argument of a macro into a string literal. You can read more about it here http://gcc.gnu.org/onlinedocs/cpp/Stringification.html.

0

精彩评论

暂无评论...
验证码 换一张
取 消