assert 怎么知道只有一个二进制的表达式实际上包含一条消息,并且它不是表达式本身的一部分?
Operator # 将宏的参数替换为它的字符串表示形式。
#define TOSTRING(parameter) #parameter
// ^^^^^^^^^ - always followed by a macro parameter
// ^ - # operator
const char *a = TOSTRING(almost anything does not matter !@#$%^&*./;[]);
// expands to:
// const char *a = "almost anything does not matter !@#$%^&*./;[]";
使用该运算符,您可以从宏中获取输入并将其作为字符串传递给您的函数:
#define myassert(expression) myassert_handle(expression, #expression)
void myassert_handle(bool expression_result, const char *exprsesion_string) {
if (expression_result == false) {
fprintf(stderr, "Och no: expression %s failed!\n", exprsesion_string);
abort();
}
}
这样:
myassert(retval == 1 && "retval is false");
// expands to
myassert_handle(retval == 1 && "retval is false", "retval == 1 && \"retval is false\"");
// and if the expression will fail, it will print:
// Och no: expression retval == 1 && "retval is false" failed!
Assert 宏还使用 __FILE__ 和 __LINE__ predefined macros 和 __func__ 在断言失败的地方打印一条漂亮的消息。而assert通常是用conditional operator实现的,这样编译器可以更好地优化它。