SOME_HEADER_H
ヘッダーがインクルードされる前に if が既に定義されている場合、2 番目のケースではプリプロセッサが を処理#pragma once
し、最初のケースでは処理しないという微妙な違いがあります。
#undef SOME_HEADER_H
同じ TU でファイルを再度インクルードすると、機能的な違いが見られます。
#define SOME_HEADER_H
#include "some_header.h"
#undef SOME_HEADER_H
#include "some_header.h"
さて、ケース 1 では、ヘッダー ファイルからのすべての定義があります。ケース2ではありません。
がなくても、ケース 1 で が無視される#undef
ため、前処理時間に違いが見られる可能性があります。それは実装次第です。#pragma once
このヘッダー ファイルを最初にインクルードする前に、既に定義されている 2 つのもっともらしい方法を考えることができます。
- (明らかなもの)完全に別のファイルが、意図的に、または偶然の名前の衝突によってそれを定義します。
- このファイルのコピーはすでに定義されています。実装によっては、このファイルが 2 つの異なるファイル名で同じ TU に含まれる場合が含まれる場合があります。たとえば、シンボリック リンクまたはファイル システムのマージが原因です。実装が をサポートしていて
#pragma once
、そのドキュメントを注意深く調べると、最適化がファイルが含まれるパスによって適用されるのか、それとも inode などのファイルのストレージを識別する何かの比較によって適用されるのか、決定的なステートメントを見つけることができる場合があります。番号。後者の場合、「本当に同じファイル」であることを隠すためにローカルファイルシステムをリモートマウントするなど、プリプロセッサをだますために引き出される可能性のある詐欺がまだあるかどうかを突き止めることさえできるかもしれません...
#pragma once
ただし、期待どおりに使用しても、 Microsoft が定義した方法で実装が処理される限り、違いはありません。スキップされるのではなく処理される限り、含まれているファイルが最適化のためにマークされるため、ファイルの 2 番目のパスで処理されるかどうかは問題ではありません。2 番目のパスは発生しません。
もちろん、プラグマは非標準であるため、少なくとも理論的には、実装が異なるとまったく異なる意味を持つ可能性があり、その場合、いつ、何回処理されるかが問題になる可能性があります。実際には、誰もそれをしないと思うでしょう。