未使用の変数の宣言を含めてもextern
、パフォーマンスの問題は発生しません(実行時には間違いなく発生しませんが、コンパイル時に認識できないほど小さなオーバーヘッドが発生します)。
ただし、コードの保守性が低下します。ベストプラクティスは、グローバルスコープの変数と関数を用途や目的に基づいてヘッダーに整理することです。概念的に関連しているものは同じヘッダーに入れられ、関連していないものは異なるヘッダーに入れられます。これにより、不要な大量のジャンクを取り込むことなく、必要な機能を簡単に組み込むことができます。
I wouldn't consider it a problem that you need to include headers in order to pull in datatype definitions. That's just part of how the C language works. You can make it easier for yourself by ensuring that all of your headers are self-sufficient. That is, if a header uses a particular datatype, that header should include the header where that type is defined. That way, your .c files don't have to worry about analyzing the header and figuring out what other headers need to be included. Headers that aren't self-sufficient can also lead to problems where code builds differently (or not at all) depending on the order in which the headers were included.