gcc – error: eliminar la referencia de puntero de tipo incompleta

Tengo un lugar complicado conjunto de estructuras anidadas/los sindicatos, como se muestra:

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 es feliz para mí para crear una Expresión de la estructura que contiene un BoolExpression valor en su unión campos como se muestra:

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;
}

aunque se da una advertencia: asignación de incompatible tipo de puntero [activado por defecto] para la línea: the_exp->expr->_bool = _bool;

Sin embargo, cuando se accede al interior de expresiones tales como lhs y rhs, con una expresión como

an_expr->expr->_bool->rhs

donde an_expr se ha creado la Expresión struct, me sale el error especificado en el título de este post.

Mucho de lo que he leído dice que este es el resultado del uso de la -> operador donde el . operador es necesaria. Sin embargo, esto no es apropiado, ya que todo es un puntero, por lo que el implícito de eliminar de la -> operador es necesaria.

Alguna idea?

  • Creo que agregar strct en la declaración BooleanExpr *_bool = safe_alloc( debe ser struct BooleanExpr *_bool = safe_alloc(, intente esto, entonces usted puede obtener de error diferentes.
  • He intentado esto, y hace que las declaraciones posteriores: _bool->lhs = lhs; _bool->op = op; _bool->rhs = rhs; a todos a dar el error: eliminar la referencia de puntero de tipo incompleta
  • No usar identificadores como _bool o _arith comenzando con un carácter de subrayado para sus propias cosas, que están reservados para la aplicación.
  • ah, ok, gracias por el heads-up
  • Como me dijo que yo era consciente de ello. 🙂 , tienes una respuesta a continuación.
InformationsquelleAutor AlexJ136 | 2013-07-17

1 Kommentar

  1. 2

    Se mezcla typedef identificadores y struct ámbito de aplicación de los identificadores. Este no puede trabajar. Hacer algo como

    typedef struct  BooleanExpr BooleanExpr;

    antes de que todos sus struct declaraciones y tienen estos sólo como

    struct BooleanExpr { ...

    sin la typedef.

    En su código que nunca se define struct BooleanExp pero sólo un anónimo struct que alias para el identificador de BooleanExp.

    • Trabajó como un encanto, gracias!

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein