2

我有一组相当复杂的嵌套结构/联合,如图所示:

typedef enum {
    expr_BooleanExpr,
    expr_ArithmeticExpr
} expr_type;

typedef union {
    struct BooleanExpr *_bool;
    struct ArithmeticExpr *_arith;
} u_expr;

typedef struct {
    expr_type type;
    u_expr *expr;
} Expression;

typedef struct {
    Expression *lhs;
    char *op;
    Expression *rhs;
} BooleanExpr;

typedef struct {
    Expression *lhs;
    char *op;
    Expression *rhs;
} ArithmeticExpr;

gcc 很高兴我在其 union 字段中创建一个包含 BoolExpression 值的 Expression 结构,如下所示:

Expression *BooleanExpr_init(Expression *lhs, char *op, Expression *rhs) {

    BooleanExpr *_bool = safe_alloc(sizeof(BooleanExpr));
    _bool->lhs = lhs;
    _bool->op = op;
    _bool->rhs = rhs;

    Expression *the_exp = safe_alloc(sizeof(Expression));
    the_exp->type = expr_BooleanExpr;
    the_exp->expr->_bool = _bool;

    return the_exp;
}

虽然它给出了一个警告:从不兼容的指针类型赋值[默认启用]为该行:the_exp->expr->_bool = _bool;

但是,当访问诸如lhsand之类的内部表达式时rhs,使用如下表达式

an_expr->expr->_bool->rhs

以前创建的表达式结构在哪里an_expr,我得到了这篇文章标题中指定的错误。

我读过的大部分内容都说这是由于在需要操作符的->地方使用了操作.符。然而,这是不合适的,因为一切都是指针,因此需要隐式取消引用->运算符。

有任何想法吗?

4

1 回答 1

2

您正在混合typedef标识符和struct范围标识符。这是行不通的。做类似的事情

typedef struct  BooleanExpr BooleanExpr;

在你所有的struct声明之前,只有这些

struct BooleanExpr { ...

没有typedef.

在您的代码中,您从未定义过struct BooleanExp,而只是定义了一个struct别名为 identifier 的匿名用户BooleanExp

于 2013-07-17T15:47:24.923 回答