我遇到了这个断言示例,并想知道#
它的用途:
#define ASSERT( x ) if ( !( x ) ) { \
int *p = NULL; \
DBGPRINTF("Assert failed: [%s]\r\n Halting.", #x); \
*p=1; \
}
我遇到了这个断言示例,并想知道#
它的用途:
#define ASSERT( x ) if ( !( x ) ) { \
int *p = NULL; \
DBGPRINTF("Assert failed: [%s]\r\n Halting.", #x); \
*p=1; \
}
它是“字符串化”预处理运算符。
它将标记作为参数传递给宏参数x
并将它们转换为字符串文字。
#define ASSERT(x) #x
ASSERT(a b c d)
// is replaced by
"a b c d"
#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
}
#
是预处理器的“字符串化”操作符。它将宏参数转换为字符串文字。如果您在评估宏期间调用ASSERT(foo >= 32)
,#x
则扩展为。"foo >= 32"
#
是第 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"
。
这是一个称为stringification的预处理器功能。它
将 [宏参数] 替换为实际参数的文字文本,转换为字符串常量。
您所看到的称为字符串化。它允许您将宏的参数转换为字符串文字。你可以在这里阅读更多关于它的信息http://gcc.gnu.org/onlinedocs/cpp/Stringification.html。