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 は、次のように、共用体フィールドに 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;

lhsただし、やなどの内部式にアクセスする場合は、次rhsのような式を使用します。

an_expr->expr->_bool->rhs

wherean_exprは以前に作成した Expression 構造体です。この投稿のタイトルで指定されているエラーが表示されます。

私が読んだことの多くは、これは演算子が必要な->場所で.演算子を使用した結果であると述べています。ただし、すべてがポインターであるため、これは適切ではなく、->演算子の暗黙的な逆参照が必要です。

何か案は?

4

1 に答える 1

2

typedef識別子とstructスコープ識別子を混在させています。これはうまくいきません。次のようなことをします

typedef struct  BooleanExpr BooleanExpr;

すべてのstruct宣言の前に、これらを次のようにのみ持つ

struct BooleanExpr { ...

なしでtypedef

コードでは定義したことはありませんが、識別子にエイリアスstruct BooleanExpする匿名のみです。structBooleanExp

于 2013-07-17T15:47:24.923 に答える