6

と の 2 つのヘッダー ファイルがある/directory1/A.hppとしdirectory2/A.hppます。これら 2 つのヘッダーの内容は異なります。

両方のディレクトリに他に必要なヘッダー ファイルがあるため、ビルド ターゲットにはとインクルード パスがA.cpp必要です。directory1directory2

さて、声明A.cppがあります。#include "A.hpp"

A.hppプリプロセッサはのどのバージョンを選択しますか?

サードパーティ製のソフトウェアを使用している場合、そのような状況が発生する可能性はありませんか?

4

4 に答える 4

10

この場合に何が起こるかは、問題のコンパイラによって異なります (使用するコンパイラのドキュメントを参照してください)。

このような状況が、「修飾されていない」ヘッダー名を使用することが一般的に悪い考えである理由です。インクルード ディレクトリは常に、パスの一部が名前の必要な構成要素になるように構成してください。例えば

#include <boost/preprocessor.hpp>
#include <gl/GL.h>

それ以外の

#include <preprocessor.hpp>
#include <GL.h>
于 2013-05-30T09:34:06.753 に答える
5

二重引用符で囲まれた include ディレクティブは、参照されているファイルをリテラル形式で貼り付けます。ファイル パスは、ソース ファイルの場所からの相対パスと見なされます。

したがって、 があった場合#include "directory1/A.hpp"、明らかなものが含まれます。#include <A.hpp>またはの場合#include "A.hpp"、どちらが検索パスの最初に表示されるかによって異なります。

一般に、ここでの競合を防ぐために、具体的でわかりやすい名前を付ける必要があります。C++ 名前空間を使用するのと同じ方法でディレクトリを使用することは、まともな方法です。libxml++ や gtkmm などのライブラリの構造を見てください。

于 2013-05-30T09:33:50.410 に答える
3

これは、コンパイル オプション、特にインクルード パスに依存します。

directory1 がインクルード パスにある場合は になり/directory1/A.hpp、それ以外の場合は directory2 がインクルード パスにある場合は になります/directory2/A.hpp。directory1 と directory2 の両方がインクルード パスにある場合、コンパイラは、#include "directory1/A.hpp".

于 2013-05-30T09:32:34.070 に答える