2

A と B など、2 つの名前空間で同じクラス名を使用しています。異なる名前空間でクラスを宣言する際に、インクルード ガードを一意にする必要がありますか?

同じインクルード ガードを持ち、異なる名前空間を宣言する 2 つのファイル名 AFile.h (異なるディレクトリ内) が存在できないということですか?

 //File 1:

 #ifndef AFILE_H 

 #define AFILE_H

 namespace A { 

   class CAFile {...

   }; 

 };

 #endif

//File 2:

 #ifndef AFILE_H 

 #define AFILE_H

 namespace B { 

   class CAFile {...

   }; 

 };

 #endif
4

4 に答える 4

10

一部のコードが (直接的または間接的に) A::CAFile と B::CAfile の両方を参照する必要がある場合、ガードは異なる必要があります。

インクルード ガードは、クラス (名前空間は言うまでもなく) の知識をまったく持たないプリプロセッサによって処理されます。C++ ファイルを処理するときにこれらのファイルが両方とも含まれていて、それらのヘッダー ガードが同じである場合、宣言の 1 つだけが、コンパイラが認識する前処理されたソースに残ります。

Boostファイルのようなものを見てください。ヘッダーガードにはいくつかの規則があります(私の記憶が正しければ)。

于 2011-03-04T07:25:17.537 に答える
5

インクルード ガードはプリプロセッサにのみ影響し、プリプロセッサは C++ を認識せず、名前空間を完全に無視します。したがって、ガードは名前空間ではなく、ファイルに固有である必要があります。

于 2011-03-04T07:22:02.180 に答える
0

要するに、それはおそらく良い考えです。これがGCCが彼らのことをする方法です...

#ifndef _GLIBCXX_VECTOR
#define _GLIBCXX_VECTOR 1

言うまでもなく名前空間の使用についてはわかりませんが、インクルード ガードはパッケージ化されたインターフェイスに固有である必要があります (すべてが 1 つの名前空間内にある場合もあれば、複数の名前空間に分散している場合もあります)。

于 2011-03-04T07:20:18.587 に答える
0

個人的には、私が#pragma once気にかけているコンパイラでサポートされており、ここで言及したような問題を回避できるため、これを使用しています。ガードを使用したい場合は#include、それについて賢くする必要があるかもしれません. そうしないと、すでにdしているため、 #includeingが機能しない可能性があります。Foo/header.h#includeBar/header.h

それ以外のスタイル ガイドには同意しませんが、Google は を推奨し<PROJECT>_<PATH>_<FILE>_H_ています。ただし、ファイルを別のパスにコピーする場合は、#includeガードを更新する必要があります。

于 2011-03-04T07:38:41.267 に答える