内側と外側のプラグマの違いには警備員が含まれますか?
-
28-10-2019 - |
質問
配置に違いはありますか #pragma once
外部とは対照的にガードを含む内部?
ケース1:
#ifndef SOME_HEADER_H
#define SOME_HEADER_H
#pragma once
ケース2:
#pragma once
#ifndef SOME_HEADER_H
#define SOME_HEADER_H
私は、コードに(プラグマとヘッダーガード)の両方を組み合わせることに決めたので、どちらかを好むべき特別なケース(ケース1またはケース2)があるかどうか、好奇心をそそります。
編集:
私は皆さんが私の質問を誤解していると思います...私はの場所について尋ねています pragma once
, 、一度-VS-ヘッダーガードではないプラグマではありません。
解決
その場合には微妙な違いがあります SOME_HEADER_H
ヘッダーが含まれる前に既に定義されていますが、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では私はしません。
なくても #undef
, 、おそらく、前処理時間の違いを見ることができます #pragma once
ケース1で無視されています。それは実装次第です。
このヘッダーファイルを最初に含める前に、すでに定義できる2つのもっともらしい方法を考えることができます。
- (明白なもの)完全に個別のファイルが、故意にまたは偶然の名前の衝突によってそれを定義します、
- このファイルのコピーはすでに定義されています。このファイルが2つの異なるファイル名の下で同じTUに関与する場合を含む可能性のある実装に応じて、例えば、シンボリックリンクまたはファイルシステムマージのためです。実装がサポートされている場合
#pragma once
, 、そして、そのドキュメントを非常に慎重に調べると、ファイルが含まれているパスによって最適化が適用されるかどうか、またはINODE番号などのファイルのストレージを識別するものの比較によって、最適化が適用されるかどうかを決定的な声明を見つけることができる場合があります。後者の場合、リモートマウントなど、プリプロセッサをトリックするために引っ張ることができる詐欺がまだあるかどうかを理解できるかもしれません。
ただし、予想される方法で使用されていますが、実装が扱われている場合は違いはありません #pragma once
マイクロソフトがそれを定義する方法で。スキップするのではなく処理されている限り、最適化のためにコンテンディングファイルをマークするため、ファイルの2番目のパスで処理されるかどうかは関係ありません - 2番目のパスは発生しません。
そしてもちろん、プラグマは非標準であるため、少なくとも理論的には、異なる実装ではまったく異なる意味を持つ可能性があります。その場合、いつ、何回処理されるかが重要です。実際には、誰もそれをしないと思うでしょう。
他のヒント
彼らは冗長です。
#pragma once
すべてのコンパイラによってサポートされていませんが、ガードは含まれています。ガードを含めるだけです。 GCCのようなコンパイラーは、ガードを含めることを理解するのに十分なほど賢く、ファイルを再び開かないことさえありません。
あなたの質問に答えるために:
ケース1:
コンパイラは、プリプロセッサ定数が設定されているかどうかを確認しますが、それを定義していない場合は、#PragmaOńceディレクティブを確認します。これは、現在のファイル名で別のハッシュルックアップを実行する前に定義されているかどうかを知るために、文字列「Some_header_h」のハッシュルックアップである可能性が最も高いです(おそらくPreprocessorによって__ファイル__定数設定)。したがって、ファイルが読み取られていない場合、ファイルが1回のハッシュルックアップだけで読み取られている場合、2つのハッシュルックアップと2つのハッシュ保存があります。
ケース2:
これは明らかにケース1と同じですが、反対の順序です。したがって、比較できるのは、ルックアップとして使用するハッシュキーの長さです。現在のヘッダーファイルへのパス、つまりパスの長さに応じて、#pragmaのハッシュルックアップは、ディレクティブが計算するのがより高価になる可能性があります。ファイル名が「c: dude.h」の場合、「some_header_h」よりも短いです。
要約していると思います。いいえ。ケース1がケース2またはその逆よりも有益であるという特別なケースはありません。少なくともHeurekaを叫ぶことはありません;)
乾杯