¿Cómo puedo tener un puntero a la siguiente estructura en la definición de esta estructura:

typedef struct A {
  int a;
  int b;
  A*  next;
} A;

esta es la forma en que yo la primera la escribió, pero no funciona.

InformationsquelleAutor claf | 2009-02-03

7 Comentarios

  1. 69

    Puede definir el typedef y adelante declarar la estructura por primera vez en una declaración, y, a continuación, definir la estructura de una definición posterior.

    typedef struct A A;
    
    struct A
    {
        int a;
        int b;
        A* next;
    };

    Edit: Como otros han mencionado, sin que el avance de la declaración de la struct nombre todavía es válida dentro de la estructura de la definición (es decir, usted puede utilizar struct A), pero el typedef no está disponible hasta después de la typedef definición es completa (para usar sólo A no sería válido). Puede que esto no importa demasiado con sólo un puntero a miembro, pero si usted tiene una compleja estructura de datos con un montón de auto-tipo de punteros, puede ser menos wieldy.

    • Esta es la «canónica» manera de hacer esto.
    • relajarse: muchos de codificación de convenciones de estilo de C se oponen firmemente a que typedefing estructuras. Yo no diría que es canónico en todo.
    • Si yo pudiera votar los comentarios, Chris Young obtendrá un +1. Hay una enorme diferencia entre los tipos nativos y estructuras agregadas. no ocultar detrás de un typedef.
    • Usted puede ahora.
    • Por qué no debo ocultarlo? Son sólo detalles de implementación.
    • ¿Por qué hay dos ‘a en typedef struct Un A; ?

  2. 59

    Además de la primera respuesta, sin un typedef y hacia adelante de la declaración, este debe estar bien también.

    struct A 
    { 
        int a; 
        int b; 
        struct A *next; 
    };
    • Más sin typedefs usted realmente saber si usted está tratando con una estructura en el código
  3. 13

    Usted puede ir adelante sin declaración:

    struct A {
        int a;
        int b;
        struct A *next;
    };
  4. 8

    Por favor, estás en C, no C++.

    Si usted realmente debe typedef struct (y la mayoría de los programadores que trabajan con not1), hacer esto:

    typedef struct _A {
        int a;
        int b;
        struct _A *next;
    } A;

    a diferenciar claramente entre _A (en el struct espacio de nombres) y A (en el tipo de espacio de nombres).

    1typedef oculta el tamaño de almacenamiento y del tipo que señala ― el argumento (y estoy de acuerdo) es que en un bajo nivel de lenguaje como C, tratando de ocultar algo que es perjudicial y contraproducente. Acostumbrarse a escribir struct A cuando te refieres a struct A.

    • ¿Cómo funciona la «estructura» de decirme nada acerca de su tamaño?
    • Se le dice que es un agregado de la estructura, y así muchas cosas como pasándole como argumentos, la devolución, comparaciones, y a = b son ineficientes o no funcionará.
    • Una es un nombre reservado. Un estaría bien.
    • Pequeñeces: _A es un mal nombre: líder subraya pertenecen al compilador. editar, Maldita sea, creo que sólo se hizo eco de MSalters.
    • Nunca lo he hecho, en todo mi tiempo de programación, se encontró con un problema de dar la estructura y el typedef el mismo nombre y, a continuación, sólo me molestes en dar la estructura de un nombre en este caso exacto (listas enlazadas, etc). Yo creo que son sólo la promoción de FUD. Puede dar un ejemplo en el que causa problemas para dar el mismo nombre para ambos? Además nunca he encontrado ningún problema mediante el uso de typedef en todas mis estructuras de ningún tipo, así que me parece que tu argumento de que «es perjudicial y contraproducente» para ser un poco más de la parte superior.
    • Tenga en cuenta que el _A en struct _A es en la ‘etiqueta’ de espacio de nombre; el A al final de la typedef se encuentra en la «ordinaria identificadores’ espacio de nombres (compartida con los nombres de las variables, los nombres de función, escriba los nombres, etc). En la medida en que es una estructura de espacio de nombre, significa que el conjunto de la estructura de los nombres de los miembros (y cada estructura o tipo de unión tiene su propio espacio de nombres). Ver C11 §6.2.3 los espacios de nombres de identificadores.
    • Tenga en cuenta que usted no debe, en general, crear una función, una variable (tag) o macro nombres que comienzan con un guión bajo. Parte de la C11 §7.1.3 identificadores Reservados dice: — de Todos los identificadores que comienzan con un guión bajo y una letra mayúscula o de otro carácter de subrayado siempre están reservados para cualquier uso.de Todos los identificadores que comienzan con un guión bajo están siempre reservados para utilizar como identificadores con el ámbito de los archivos, tanto el ordinario y el nombre de la etiqueta espacios. Véase también ¿Qué hace el doble carácter de subrayado (__const) significa en la C?

  5. 0
    typedef struct {
     values
    } NAME;

    Este es el camino más corto para typedef struct creo que es la más fácil de notación, simplemente no poner el nombre delante pero por detrás.

    entonces, usted puede llamar como

    NAME n;  
    
    NAME *n; //if you'd like a ptr to it.

    Nada malo con este enfoque?

    • así como se indica en la pregunta, la necesidad es tener un puntero DENTRO de la estructura (encadenado lista) así que no veo cuál es su respuesta añadir aquí.
  6. 0

    Utilice el siguiente preprocesador:

    #define structdef(NAME) typedef struct NAME NAME; struct NAME 

    Uso:

    structdef(node_t)
    {
       void* value;
       node_t* next;
    };

Dejar respuesta

Please enter your comment!
Please enter your name here