2014-03-30 263 views
5

我發現#include "../app/thing.h"很醜陋,我希望能夠從我的項目的主要根源導入,就像這樣:C++包括完整路徑

#include <project/app/submodule/thing.h>

(我知道<>一般使用外部但我覺得它非常乾淨)

我該如何做到這一點,從我的項目中的任何地方?

+2

請參閱[相對路徑有什麼好處,例如'「../ include/header.h」'頭部?](http://stackoverflow.com/questions/597318/) - TL; DR ,沒有太多的好處,有負債。 –

+2

對於始終在一起移動的文件使用相對路徑只是常識。對於那些,你必須使用「」。 – Deduplicator

+0

好吧,你們兩個相信我,我會走相對路徑... – valentin

回答

3

您只需確保您的構建過程設置了一個選項來指定搜索的起點。

例如,如果你的標題是:

/work/username/src/project/app/submodule/thing.h 

則需要包括(假定一個符合POSIX標準的編譯器; AFAICR,甚至MSVC使用/I作爲-I模擬):

-I/work/username/src 

作爲編譯器選項之一。您可以在項目中的任何地方使用該路徑,因爲它是絕對的。您只需要爲構建系統定義一個方法來知道該設置應該是什麼,以便當它移動到/home/someone/src/時,您只有一個設置需要更改。

+0

對於每一個編譯器,它不一定是'-I'。 –

+0

指定一個關閉Windows的編譯器,它不是'-I'?我已經給答案添加了一個警告 - 並提到我相信Windows使用'/ I',因爲那裏的選項以'/'而不是'-'開頭。 –

+0

我還沒有遇到過一個不使用'-I'的編譯器,但是當然有可能編譯器沒有。即使MS編譯器也採用-I(即使他們更喜歡/ I) –

1

您可以簡單地使用當前編譯器的include目錄選項(通常爲-I)來實現此目的。

另請注意,使用""雙引號只會添加到編譯器標準頭文件的回退中。使用<>包含的文件只能保證從編譯器標準頭文件搜索文件。

+3

這是錯的! 「」回落到<>,而不是相反。雖然「」應該包括文件相對模式作爲第一個搜索,但只有保證找到標準頭文件。 – Deduplicator

+1

@Deduplicator THX用於指出。我試圖修復...... –

1

請參閱this answer瞭解有關兩種格式之間差異如何工作的更完整說明。老實說,我想你可能會考慮重構你的文件夾層次結構,如果你需要跳過一個文件夾然後跳轉到另一個文件夾來獲得一些東西。一般來說,在文件夾結構中(即在同一個文件夾中)將所有文件保存在本地的程序本地,以及所有非本地文件但可能需要的文件(例如在主程序文件夾內的子文件夾中,或在編譯時包含它們。

需要注意的是,在上面鏈接的答案中,它解釋了「<>」包含「實現相關」,所以我們確實需要知道您使用的是什麼編譯器來告訴您是否可以或不能這樣做。