What is the # for when formatting using %s
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.
精彩评论