当前位置: 首页 > 工具软件 > UCC > 使用案例 >

UCC编译器学习笔记12

鄂慈
2023-12-01

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;

*/

 类似资料: