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

时间:2011-03-18 15:58:26

标签: c++ c c-preprocessor stringification

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

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

7 个答案:

答案 0 :(得分:9)

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

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

#define ASSERT(x) #x

ASSERT(a b c d)
// is replaced by
"a b c d"

答案 1 :(得分:4)

#x是字符串化指令

#define Stringify(x) #x

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

,如

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

int main()
{
   initVarWithItsOwnName(Var);
   std::cout << Var; //will print Var
}

答案 2 :(得分:3)

#是预处理程序的"stringizing" operator。它将宏参数转换为字符串文字。如果您致电ASSERT(foo >= 32),则在评估宏时,#x会扩展为"foo >= 32"

答案 3 :(得分:2)

这是一个名为stringification的预处理器功能。它

  

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

答案 4 :(得分:2)

#是第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"

答案 5 :(得分:1)

答案 6 :(得分:0)

您看到的内容称为 stringification 。它允许您将宏的参数转换为字符串文字。您可以在http://gcc.gnu.org/onlinedocs/cpp/Stringification.html了解更多相关信息。