2013-05-30 187 views
2

假設我們有兩個頭文件:/directory1/A.hppdirectory2/A.hpp。這兩個標題的內容是不同不同頭文件包含路徑

我們的構建目標A.cpp需要directory1directory2作爲包含路徑,因爲在這兩個目錄中還有其他需要的頭文件。

現在,在A.cpp中有一個#include "A.hpp"聲明。

預處理器會選擇A.hpp的哪個版本?

如果一個人使用第三方軟件,可能會出現這種情況嗎?

+1

我認爲編譯器只是用文件的內容替換了'#include'行,所以名稱無關緊要。 – Djon

+1

如果您使用'#pragma once'或包含守衛,則無關緊要,因爲內容只會插入一次。 –

+0

對不起,忘記提及如果兩個頭文件不同,會發生什麼情況,請參閱編輯。 – Juergen

回答

9

在這種情況下會發生什麼取決於所討論的編譯器(請參閱您使用的編譯器的文檔)。

像這些情況是使用「不合格」標題名稱通常是一個壞主意的原因。始終構建您的包含目錄,以使路徑的一部分成爲名稱的必要組成部分。例如。

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

代替

#include <preprocessor.hpp> 
#include <GL.h> 
3

這將取決於您的編譯選項,並且更具體地取決於您的包含路徑。

如果directory1位於包含路徑中,它將是/directory1/A.hpp,否則,如果directory2位於包含路徑中,它將是/directory2/A.hpp。 如果directory1和directory2都位於包含路徑中,編譯器會要求您指定目錄,如#include "directory1/A.hpp"

+3

在最後一種情況下,它不會「要求你指定」任何東西。它是「首先找到的」(通常意味着包含目錄列表中列出的第一個)。 –

4

帶雙引號的include指令粘貼以文字形式引用的文件。文件路徑被認爲是相對於源文件位置。

所以,如果你有#include "directory1/A.hpp",它將包括明顯的一個。如果您#include <A.hpp>#include "A.hpp",它取決於哪一個出現在您的搜索路徑的第一個。

通常,您應該具有特定的描述性名稱以防止爭用。以與使用C++名稱空間相同的方式使用目錄是一種足夠體面的練習。看看像libxml ++和gtkmm這樣的庫的結構。

1

編譯器股包括,該目錄包括被列爲參數-I順序文件。使用找到的第一個文件。

如果有兩個文件名稱相同,則應指定源文件中您想要的文件。