Me había encontrado el siguiente código:

typedef struct {
        double x;
        double y;
        double z;
} *vector;

Es este un tipo válido definición? El código se compila y se ejecuta correctamente. Yo era solo por curiosidad, si esta es la práctica común.

InformationsquelleAutor | 2009-10-09

6 Comentarios

  1. 55

    Absolutamente válida.
    Generalmente, usted puede tomar ventaja completa de esta manera, mediante la definición de dos tipos de juntas:

    typedef struct
    {
     int a;
     int b;
    } S1, *S1PTR;

    Donde S1 es una estructura y S1PTR es el puntero a esta estructura.

    • …y tal vez const *S1CPTR.
    • Solo para confirmar lo entiendo. Es que equivalente a typedef struct {...} S1; typedef S1* S1PTR;?
  2. 25

    Sí lo es. Pero en mi humilde opinión es mal estilo. No el directo de la declaración de la estructura, pero el directo de la declaración de un tipo de puntero. Es ofuscación, la información de que una variable o parámetro es un puntero (y en menor medida para las matrices) es extremadamente importante cuando se desea leer el código.

    Cuando la revisión de código es a menudo difícil de ver a primera vista que la función podría tener un efecto secundario o no. Si los tipos utilizados ocultar esta información, se añade un proceso de memorización de la carga para el lector.

    int do_fancy(vector a, vector b); 

    o

    int do_fancy(vector *a, vector *b);

    en el primer caso yo se la puede perder fácilmente que la función puede cambiar el contenido de una o b. En la segunda estoy advirtió.

    Y al escribir código, también sé directamente para escribir a->x y no tiene el compilador me dicen error: request for memberx’ en algo que no es una estructura o unión».

    Sé, parece una cosa de gusto personal, pero después de haber trabajado con un montón de código externo, puedo asegurar que es muy molesto cuando no reconocer el nivel de direccionamiento indirecto de las variables. Esa es una razón también me disgusta C++ referencias
    (en Java que no es porque no todos los objetos se pasan por referencia, es consistente) y Microsoft LPCSTR clase de tipos.

    • +1 por la observación de que typedef struct { ... } *obj conduce a un tipo que misteriosamente se requiere -> en lugar de . para el elemento de acceso.
    • Estrictas convenciones de nomenclatura sería informará al usuario sobre el tipo de typedef, así que no es realmente de mal estilo. Sin embargo entiendo tu punto de vista cuando se trabaja con el código externo utilizando diferentes de codificación de las prácticas,
  3. 3

    Sí es válido. Si usted necesita más «seguridad» también se puede hacer

    typedef struct vector_{
            double x;
            double y;
            double z;
    } *vector;

    entonces usted puede utilizar tanto

    struct vector_ *var;
    vector var;

    Pero no olvides el final semi-colon.

    Utilizando sólo typedef significa que usted nombre de esa manera. de lo contrario, sería más o menos anónimos.

    • Yo creo que se puede utilizar el mismo nombre para ambos (es decir, no es necesario el subrayado, pero puede dejar todo lo demás en su código de la misma, debido a que los espacios de nombres son independientes).
  4. 2

    Es válido, lo que hace es que define un nuevo tipo. Como @Alex, dijo, sería útil para definir un tipo y tipo de indicador.

    Podría crear más punteros sólo por el uso de

    S1PTR ptr1, ptr2, ptr3, ...;  

    lugar de

    S1 *ptr1, *ptr2, *ptr3, ...;
  5. 1

    Sí es válido, como se describe en respuestas anteriores. Una pequeña sugerencia, sería mejor si usted proporciona un nombre de etiqueta también, de la siguiente manera. Esto podría ayudar a algunos IDEs para mejor analizar el código.

    typedef struct vactor_tag {
            double x;
            double y;
            double z;
    } *vector;
  6. -2

    sí…le ahorra la molestia de estar constantemente escribiendo la palabra ‘struct’ cada vez que se declara el vector de estructura o un puntero a él.

    • Creo que la pregunta tenía que ver más con el typedef ing a *vector en lugar de solo vector.

Dejar respuesta

Please enter your comment!
Please enter your name here