2014-01-08 10 views
6

私はいつも#includeを/#defineのInclude-Guardの後に置いていました。私のIDE(Qt Creator)のリファクタリングメカニズムは、Include-Guardの前に置いています。前に#include#ifdef /#define Include-Guardは大丈夫ですか?

#include "AnotherHeader.h" 

#ifndef MYHEADER_H 
#define MYHEADER_H 

これは何か問題を引き起こす可能性がありますか、このままにすることはできますか?

+0

"AnotherHeader.h"内にガードを含めてください。 –

+2

この質問は、qtタグとは関係がないように見えるので、削除してください。 – lpapp

+1

これをコンパイルしても、あなたのコードのすべての読者は、なぜあなたがガードの前にファイルをインクルードするのか不思議に思うでしょう。チーム内で共通のコードであれば、そのようなコードをコミットする必要があります。 – hansmaad

答えて

5

問題のヘッダーにガード自体が含まれていると、問題が発生しません。インクルードガードの内側に置くと、コンパイルが速くなる可能性があります。たとえエラーが発生しなくても、コンパイラーが表示されないものは、コンパイルに要する時間が短くなります。

+0

IIRC、GCCはヘッダーガードパターンを検出し、さらに重複する包含を除外します。しかし、OPがやったようなことをすると、コンパイル速度の改善が無効になる可能性があります。 –

0

単にチェックアウトしてください。 2つの異なるヘッダーがMyHeader.hを使用すると仮定しましょう。

  1. AnotherHeader.h
  2. 無条件に含まれているガードがあなたのヘッダファイルの残りの部分をロードすることができます含めます。

次の時間:

  1. AnotherHeader.hが無条件に再び
  2. 含まれているが、ガードがあなたのヘッダファイルの残りの部分をロードすることを防止する含めます。

AnotherHeader.hが含まれている場合、何も悪いことはありません。しかし、一般に私はあなたのファイルの先頭にインクルードガードを置いていました。すでにロードされていたときには、もう一度ロードするという意味はありません。AnotherHeader.h

0

一般的ではありませんが、これは受け入れられると考えられますが、注意してください:円形の#includeの場合、インクルードは通常、インクルードの最大深度に達するまでプレパーサーが不平を言うまで)。これはインクルードガードの後で#includeのものでは起こりません。

(円形#include年代は、いかなる場合にも良いスタイルとはみなされませんが、それはそれにもかかわらず使用されている場合、それは#includeで動作する可能性がある "後のインクルードには警備員が含まれていますが、確かに#includeさんとしませんの前に)

+0

これは、include guardの外側に置くことをお勧めします。そうすれば、循環する '#include 'を作成するかどうか知ることができます。 – YoYoYonnY

関連する問題