C: puntero a struct en la definición de estructura

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

así es como lo escribí por primera vez, pero no funciona.

Puede definir el typedef y reenviar declare la estructura primero en una statement, y luego definir la estructura en una definición posterior.

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

Editar: como otros han mencionado, sin la statement directa el nombre de la estructura sigue siendo válido dentro de la definición de estructura (es decir, se puede usar struct A ), pero el typedef no está disponible hasta después de que se complete la definición typedef (usando simplemente A wouldn ‘ t ser válido). Esto puede no importar demasiado con solo un miembro de puntero, pero si tiene una estructura de datos compleja con muchos punteros de auto-tipo, puede ser menos manejable.

Además de la primera respuesta, sin una statement typedef y forward, esto también debería estar bien.

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

Te estás perdiendo la struct antes del A*

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

Puede ir sin statement adelante:

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

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

Si realmente debe escribir una estructura (y la mayoría de los progtwigdores con los que trabajo no lo haría), haga esto:

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

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

¹ typedef oculta el tamaño y el almacenamiento del tipo al que apunta – el argumento (y estoy de acuerdo) es que en un lenguaje de bajo nivel como C, tratar de ocultar algo es perjudicial y contraproducente. Acostúmbrate a escribir struct A cuando quieras decir struct A

 typedef struct { values } NAME; 

Esta es una manera más corta de typedef una estructura, creo que es la notación más fácil, simplemente no pongas el nombre enfrente sino detrás.

entonces puedes llamarlo así

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

¿Hay algo malo con este enfoque?