5

我遇到了这个断言示例,并想知道#它的用途:

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

7 回答 7

9

它是“字符串化”预处理运算符。

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

#define ASSERT(x) #x

ASSERT(a b c d)
// is replaced by
"a b c d"
于 2011-03-18T16:01:05.213 回答
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
}
于 2011-03-18T16:01:01.397 回答
3

#是预处理器的“字符串化”操作符。它将宏参数转换为字符串文字。如果您在评估宏期间调用ASSERT(foo >= 32)#x则扩展为。"foo >= 32"

于 2011-03-18T16:01:16.973 回答
2

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

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

如果导致的替换不是有效的字符串文字,则行为是undefined。# 运算符的求值顺序未指定

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

在以下示例中:

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

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

于 2011-03-18T16:04:59.667 回答
2

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

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

于 2011-03-18T16:01:23.057 回答
1

它是字符串化操作符。

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

于 2011-03-18T16:03:21.303 回答
0

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

于 2011-03-18T16:03:39.177 回答