重複ヘッダーの自動除外の難しさの1つは、ファイル名を含むことの意味に関して、C標準が比較的静かであることです。たとえば、コンパイル中のメインファイルにディレクティブ#include "f1.h"
とが含ま#include "f2.h"
れ、それらのディレクティブで見つかったファイルに両方が含まれているとします#include "f3.h"
。f1.h
およびf2.h
が異なるディレクトリにあるが、インクルードパスを検索して見つかった場合、#include
それらのファイル内のディレクティブが同じf3.h
ファイルまたは異なるファイルをロードすることを意図していたかどうかは不明です。
相対パスを含むインクルードファイルの可能性を追加すると、事態はさらに悪化します。ヘッダーファイルがネストされたincludeディレクティブに相対パスを使用し、提供されたヘッダーファイルに変更を加えないようにする場合、プロジェクトのディレクトリ構造内の複数の場所にヘッダーファイルを複製する必要がある場合があります。そのヘッダーファイルの複数の物理コピーが存在していても、それらは意味的には単一のファイルであると見なされる必要があります。
場合#pragma once
ディレクティブがフォローする識別子許可once
識別子は、以前の遭遇から1一致した場合、コンパイラは、ファイルをスキップする必要があることを意味論で、#pragma once
ディレクティブを、その意味は明確なことでしょう。#include
ディレクティブが#pragma once
以前のタグと同じタグ付きファイルをロードすることを伝えることができるコンパイラーは、ファイルを再度開かずにスキップすることで少し時間を節約できますが、ファイルはスキップされるため、そのような検出は意味的に重要ではありませんファイル名が一致として認識されたかどうか。ただし、そのように動作するコンパイラは知りません。ファイルがパターンに一致するかどうかをコンパイラに観察#ifndef someIdentifier / #define someIdentifier / #endif [for that ifndef] / nothing following
させ、次の#pragma once someIdentifier
場合にそのようなものを上記と同等に処理するsomeIdentifier
定義されたままで、基本的には良好です。
#pragma once
、そのファイルを1回だけ含めるようにコンパイラに指示するものがあります。