assert函数
/***********************************************************
assert(sym->kind == SK_TypedefName);
(void)((e)||_assert(#e, __FILE__, __LINE__))
(void)((sym->kind == SK_TypedefName)||_assert("sym->kind == SK_TypedefName", __FILE__, __LINE__)) //这个意思应该是前面为1,则不执行后面的,也就是如果要比较的两个值相等了,则不执行后面的_assert函数了,因为这个函数会打印错误信息和abort整个程序,结束
***********************************************************/
extern int _assert(char *, char *, unsigned);
#define assert(e) ((void)((e)||_assert(#e, __FILE__, __LINE__))) //这里的#e,作用就是把e左右加上双引号,也就是变成字符串。
/**
* GCC uses built in assert. Here provide our implementation for assert.
*/
int _assert(char *e, char *file, int line)
{
fprintf(stderr, "assertion failed:");
if (e)
fprintf(stderr, " %s", e);
if (file)
fprintf(stderr, " file %s", file);
fprintf(stderr, " line %d\n", line);
fflush(stderr);
abort(); //直接终止程序,比exit()函数还暴力一些
return 0;
}
--------------------------------------------------------------------------------------------------
关于写代码方面:
AstExpression CheckConstantExpression(AstExpression expr)
{
expr = CheckExpression(expr);
if (! (expr->op == OP_CONST && IsIntegType(expr->ty)))
{
return NULL;
}
return expr;
}
//从写代码的角度,我觉得上面写成下面的代码更容易理解
/*
if (expr->op == OP_CONST && IsIntegType(expr->ty))
{
return expr;
}
else
return NULL;
*/