Per quanto riguarda il punto "Non solo prototipi": Micheal Barr specifica queste indicazione su funzioni inline (che non sono normali funzioni!): normalmente nell'header vanno messe solo le dichiarazioni delle funzioni standard, mai le definizioni!. Per come sono le funzioni inline, il discorso è diverso ed è per questo che Barr specifica alcune casistiche in cui il corpo della funzione inline sia nell'header;
A volteextern deve essere usato. Tecnicamente, tutte le dichiarazioni di funzioni nel modulo hanno implicitamente l'attributo extern. Non è detto che far vedere una variabile accessibile fuori dal modulo sia cattiva programmazione, anzi. Diciamo che è una scelta da soppesare
Anche con il commento, non sono molto d'accordo per la question "#2";
"static": devi scrivere che static va messa nei file "*.c". Mettere un qualcosa statico all'interno di un header è una cosa stupida da fare;
In riferimento a "dati strutturati": quella scelta del "typedef struct foo foo" non deve essere la norma. Ci sono svantaggi in questa scelta. Guarda la pagina della wiki relativa all'esempio di modulo: in fondo scrivo i vantaggi e gli svantaggi;
Bisogna ancora dire cosa fa la parola "extern": è importantissima per capire i moduli ed in generale C