2011-11-09 33 views
3

C++項目中頭文件的首選策略是什麼:<test.h>"test.h"? 在我的經驗,我用:C++頭文件樣式

  1. #include <test_lib.h>包括C/C++頭文件,第三方零件庫,其路徑在項目設置中指定(增強等)。
  2. #include "my_test.h" - 它用於項目中存在的頭文件。

任何其他做法可以在這裏適用?

可以包含帶有相對路徑的頭文件:像#include "../new_test.h"?或者移動相對路徑到項目設置會更好嗎?

回答

2

尖括號用於包含系統標題。理論上來說,IIRC,他們甚至不一定是文件。在實踐中,<>表示做而不是搜索當前目錄,只有包含路徑,而""表示查看當前目錄,然後搜索包含路徑。

至於相對路徑,它可能取決於你的環境,我會建議路徑相對於你的項目包含路徑(由-I指定)。

+0

編譯器cl,gcc之間有區別嗎? –

+0

我不會賭我的歐元,但正如我所說,實際上大多數實現都遵循上述相同的過程。 –

0

This MSDN文章解釋了預處理程序如何根據#include語法形式搜索標題。您的風格非常好,因爲Visual C++,Windows Framework,Boost和其他框架/包的標頭(通常)都位於項目目錄之外。

關於你的第二個問題,我的建議是避免相對路徑。如果你圍繞這個標題移動,你需要通過改變你的代碼來調整相對路徑,這是一個壞主意。我寧願將它放在尖括號內並添加到/I選項的路徑。例如。要在項目中包含C:\frameworks\frameworkA\include\a.h,您可以使用#include <a.h>\I "C:\frameworks\frameworkA\include"

,如果你的框架根路徑添加到/I,然後把局部路徑尖括號內的頭它也許是更多的描述。例如。 #include <frameworkA\include\a.h>/I "C:\frameworks"。現在在代碼中明確表示a.h屬於frameworkA

僅爲項目目錄中的標題使用相對路徑(例如,如果將代碼組織到位於項目子目錄中且不打算移動的模塊中)。

+0

+1爲描述性的包含位,當項目依賴於多個庫時真的有用! –

+0

關於MSDN主題,你可以澄清一下這句話:「在任何以前打開的包含文件的目錄中,它們是以相反的順序打開的。搜索從最後打開的包含文件的目錄開始,並繼續通過目錄首先打開的包含文件。「 –

+0

說實話,我從來沒有依賴這條規則,但我猜想VC編譯器通過將它們放到堆棧上「記住」所有先前解決的路徑。如果在步驟1中找不到標題,則預處理器將從棧頂開始,使用這些記憶的路徑,這是最近路徑。恕我直言,這個規則(2)引入了一些混淆,因爲它允許所有具有先前解析路徑的頭文件可以包含在引用語法中。例如'bh'和'ch'在'C:\ foo'中,並且您有# include「ah」#include #include「ch」'和'/ I「C:\ foo」'.ch'將在爲'bh'解析的路徑上找到。 –

0
  1. 您可以使用。在編譯時可以使用-I <directory containing test.h>選項使用<test.h>。一般來說,這是我遵循的做法,我傾向於對所有頭文件使用<test.h>,而不管它們是第三方頭文件還是我寫的頭文件。

  2. 這可能是一個好主意,不要使用相對路徑"../test.h"。從個人經驗來看,這種編寫#include聲明的方式迫使你強化你的目錄結構。如果您決定明天將test.h移動到不同的目錄中,則必須進入每個頭文件並將test.h的相對路徑更改爲新路徑 - 這是一個耗時的練習。最好把它轉移到makefile(通過-I),然後從那裏處理它。