Estilo de encoding C typedef para estructuras opacas

Así que entiendo que typedefs es aceptable para estructuras opacas que solo pueden ser manipuladas por las funciones de acceso.

¿Es esta la manera apropiada de usar estructuras opacas de typedef que son autorreferenciales dentro de las funciones de acceso?

typedef struct foo { struct foo *bar; int member; } foo1; foo1 * blah1 = (foo1*) malloc(...); blah1->bar->member = 999; 

La alternativa es esta:

  typedef struct { struct foo* bar; int member; }foo; 

Así que cuando haces algo como esto:

  foo * blah1 = (foo*) malloc(...); blah1->bar->member = 999; 

Obtendrás este error:

  dereferencing pointer to incomplete type 

Esta pregunta es similar a pedir una statement hacia adelante de una estructura sin nombre. No puede reenviar declarar una estructura sin nombre y, de manera similar, no puede usarla como miembro en la misma estructura que ha mostrado:

 typedef struct { struct foo* bar; int member; }foo; 

Esto es porque el comstackdor simplemente no puede saber el tipo. struct foo no es lo mismo que struct typedef anónimo a foo. Las respuestas anteriores de stackoverflow explican claramente la razón:
Forward declarando un typedef de una estructura sin nombre
y
Reenviar declaraciones de estructura sin nombre