我遇到了这个断言的例子,并想知道#
的用途是什么:
#define ASSERT( x ) if ( !( x ) ) { \
int *p = NULL; \
DBGPRINTF("Assert failed: [%s]\r\n Halting.", #x); \
*p=1; \
}
答案 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了解更多相关信息。