次のように、ネストされた構造体/共用体のかなり複雑なセットがあります。
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 構造体です。この投稿のタイトルで指定されているエラーが表示されます。
私が読んだことの多くは、これは演算子が必要な->
場所で.
演算子を使用した結果であると述べています。ただし、すべてがポインターであるため、これは適切ではなく、->
演算子の暗黙的な逆参照が必要です。
何か案は?