_ で始まる識別子はコンパイラが使うから、使うとどうなるかわからない、使うべきでないと聞いた覚えがあるんですが、
他人のコードを見ると、普通に使われてるような気がします。
本当はダメなんだけど、使っても問題ないことがおおいってことですかね。(それとも↑がウソで、まったく問題ないのか)

あと、 typedef struct _hoge { ... } hoge; って感じで(両方hogeじゃなくて)違う名前にするのは、何か利点があるんですか?