ほとんどの場合、内部のインクルード ファイルにインクルード ガードがある限り、実質的な違いはありません。あなたが最も理にかなっていると思う場所に置いてください!
ただし、#ifndef GUARD
ファイルのロードに時間がかかる場合 (たとえば、負荷の高いネットワーク ドライブや低速のディスクにある場合)、大規模なプロジェクトで同じヘッダー ファイルは、同じプロジェクトに何度も含まれる場合があります。
「common.h」があるとしましょう:
#include <iostream>
#include "lesser_common.h"
#include "not_so_common.h"
#ifndef COMMON_H
#define COMMON_H
... stuff goes here ...
#endif
main.c には、
#include <iostream>
#incldue "common.h"
#include "myheader1.h"
#include "myheader2.h"
#include "myheader3.h"
myheader{1,2,3}.h には common.h も含まれています。
理論的には、プリプロセッサは common.h のすべてを 4 回、iostream を 5 回読み取る必要があります。インクルード ガードを外して、common.h がインクルードされたときに他のファイルがインクルードされないようにすると、少なくとも iostream の 3 回の読み取りが保存されます。多数の他のファイルを含む膨大な数のファイルを含む大規模なプロジェクトの場合 [特に、「このファイルを使用する前に他のファイルを含める必要はない」という原則に同意する場合]、これは合計される可能性があります。かなりのファイル読み取りに。ファイルをどのように/どこに配置するかを主に選択するべきではありませんが、少しは心に留めておくことをお勧めします。
そうは言っても、ほとんどのプリプロセッサは「賢い」ものであり、最初にファイルの上部と下部にガードが含まれているかどうかを理解しており、次回はヘッダーを読み取る必要はありません。
また、実際に必要でない限り、ヘッダー ファイルにファイルを含めないことは非常に良い考えです。もちろん、ソース ファイルにも同じことが当てはまります。