使用%s格式化时的#是什么

我遇到了这个断言的例子,并想知道#是什么:

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

它是“stringize”预处理运算符。

它将作为参数传递的标记作为宏参数x并将它们转换为字符串文字。

 #define ASSERT(x) #x ASSERT(abcd) // is replaced by "abcd" 

#x是stringification指令

#define Stringify(x) #x

表示Stringify(abc)将替换为"abc"

如在

 #define initVarWithItsOwnName(x) const char* p = #x int main() { initVarWithItsOwnName(Var); std::cout << Var; //will print Var } 

#是预处理器的“字符串化”运算符 。 它将宏参数转换为字符串文字。 如果你调用ASSERT(foo >= 32) ,在评估宏时,#x会扩展为"foo >= 32"

这是一个称为字符串化的预处理器function。 它

用实际参数的文字文本替换[宏参数],转换为字符串常量。

#是第6.10.3.2节(C99)和第16.3.2节中定义的字符串化运算符。 (C ++ 03)

它将宏参数转换为字符串文字,而不扩展参数定义。

如果结果的替换不是有效的字符串文字,则行为未定义 。 #运营商的评估顺序未指定

例如,在语法上,字符串文字中出现的反斜杠字符仅限于转义序列。

在以下示例中:

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

#运算符的结果不必是"a \ b"

它是字符串化运算符。

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

你看到的是字符串化 。 它允许您将宏的参数转换为字符串文字。 您可以在http://gcc.gnu.org/onlinedocs/cpp/Stringification.html上阅读更多相关信息。