如果我有我自己的圖書館項目,我應該使用哪種風格的#include
他們在我的應用程序中的標題?是否有嚴格的規則,並且這兩者實際上對編譯器/預處理器有不同的含義,還是隻針對標準?#include「xxx.h」上的規則是什麼?#sinclude <xxx.h>?
回答
通常,使用引號表示頭文件位於項目目錄的相對位置。另一方面,如果使用尖括號,編譯器會期望您的頭文件位置爲標準位置。例如/usr/include
,/usr/local/include
或您的編譯器的任何其他默認位置。
在GCC如果您使用-I
標誌,包括與角括號將在指定的位置搜索也。
例子:
$ gcc -Wall -I/path/to/my/library/include myfile.c
所以,如果你在/path/to/my/library/include
有myfile.h
,您可以在myfile.c
源使用#include <myfile.h>
。
根據ISO標準,有幾條規則。這兩種形式都依賴於實現,因爲它們在哪裏查找頭文件。他們甚至不必爲文件。
科C++ 11 2.9
使得比其他事實,兩個品種之間沒有區別,你可以包括在<>
變種"
和>
在""
變量,但很少人會傻得使用文件名中這些字符:-)
科16.2
進一步指出:
形式
# include < h-char-sequence> new-line
搜索的預處理指令由指定序列唯一標識的標題的實現定義位置序列,該位置由<
和>
定界符之間的指定序列唯一標識,並導致該標題的全部內容替換該指令。如何指定位置或標識的是實現定義的。形式爲
# include " q-char-sequence" new-line
的預處理指令導致用指定序列標識的源文件的全部內容替代該指令,該源文件由"
定界符之間的指定序列標識。指定的源文件是以實現定義的方式搜索的。如果此搜索不受支持,或者搜索失敗,則會重新處理該指令,就像它讀取的# include < h-char-sequence> new-line
具有相同的包含序列(包括來自原始指令的>個字符,如果有的話)。
我傾向於使用我自己的頭<>
系統頭和""
,但僅是個人喜好。我想指出的是,上述C++ 11號文件規定:
注意:雖然實現可用於製造可用於
<>
搜索任意源文件,一般的程序員應該使用<>
形式提供的頭文件提供了一種機制與實施,以及""
形式的實施控制之外的來源。
這不是強制性的,但它仍是一個好主意。
它影響預處理程序搜索包含文件的位置。從MSDN:
「引用形式:此表單指示預處理程序在包含#include語句的文件的相同目錄中查找包含文件,然後在包含(#include)的任何文件的目錄中查找然後預處理器沿着/ I編譯器選項指定的路徑搜索,然後沿INCLUDE環境變量指定的路徑搜索。
角支架形式:此表單指示預處理器首先沿路徑搜索包含文件由/ I編譯器選項指定,然後在從命令行編譯時,沿着由INCLUDE環境變量指定的路徑。「
作爲一個粗略的指南,當我試圖指定一個相對於包含帶有#include的文件的目錄的路徑時,我只使用了引號。否則,我只是使用尖括號。從我目前的項目的例子:
#include <algorithm> // standard library headers
#include <numeric>
#include <stack>
#include <boost/function.hpp> // third-party library headers
#include <boost/lexical_cast.hpp>
#include <common/io/util/LineIO.h> // specified relative to my own base include dir
#include "PartitionForest.h" // a header in the current directory
有幾個不同的操作系統使用的幾十編譯器之後,我的建議是使用<x.h>
只爲系統和頭包括具體的操作,以及"y.h"
其他一切,包括你的庫和項目標題。
然後,使用編譯器的-I
(或其他)選項設置適當的包含搜索路徑。如果您使用類似make
或ant
來進行構建,這會更容易。
對於第三方軟件標題,您可以使用任一表單。如果軟件包已安裝且可供所有用戶訪問(例如,在某個地方如/usr/local/bin
或/usr/site/bin
),那麼<x.h>
表單可能更正確。如果它安裝在本地構建樹中,那麼"y.h"
表單更加正確,因爲它在構建過程中受到控制。
這種組合是最便攜的。
- 1. 「#include <iostream>」是做什麼用的?
- 2. #include <crtdll/stddef.h>是什麼意思?
- 3. 規格尺寸的規則是什麼?
- 4. 爲什麼「<! - 」註釋掉樣式規則,但「<! - 」不是?
- 5. 什麼是輸入規則?
- 6. 什麼是80列規則?
- 7. 什麼是「級聯規則」?
- 8. Firebase規則:什麼是.contains()?
- 9. 這是什麼CSS規則?
- 10. 爲什麼我們使用`#include「stdafx.h」`而不是`#include <stdafx.h>`?
- 11. 不同類型的比較規則是什麼(< and >)?
- 12. 什麼是Swift上的+++和<<<?
- 13. 什麼是cppcheck規則文件<pattern>語法?
- 14. 什麼是基於規則的算法?
- 15. 數組引用的規則是什麼?
- 16. HTML屬性值的規則是什麼?
- 17. Lua的string.gsub模式規則是什麼?
- 18. Nullify刪除規則是幹什麼的?
- 19. 命名AS3類的規則是什麼?
- 20. 缺少robots.txt的規則是什麼?
- 21. 便攜式CSS的規則是什麼?
- 22. Ruby中的空間規則是什麼?
- 23. 更新視圖的規則是什麼?
- 24. 寫iptables規則的速度是什麼?
- 25. 什麼是正確的重寫規則?
- 26. TCP的重傳規則是什麼?
- 27. 爲什麼不#include <Python.h>工作?
- 28. 爲什麼#需要#include <stdio.h>?
- 29. C語言,如何包括 「XXX.h」 到<XXX.h>」,文件可能使用的Makefile
- 30. iPhone OS上的結構對齊的確切規則是什麼?
我沒有意識到這是完全實現定義的。但(至少)gcc搜索當前目錄的事實是,當且僅當你使用引號時,意味着你當然不應該爲你自己的頭文件使用尖括號,對吧? – Cascabel 2010-11-07 15:38:07
如果gcc的確如此(我沒有理由懷疑你),那麼是的,除非你在'-I'路徑中放入'.'。但問題是標記爲C++,這就是爲什麼我要求標準。但看到更新,ISO建議如何使用這兩種類型,但沒有強制要求。 – paxdiablo 2010-11-07 16:01:28
仍然不太清楚在我公司的代碼庫中用於各種應用程序的庫的位置。他們是第三方,因爲它可能是一個單獨的團隊,但不完全。我傾向於在_this_項目中使用「xxx.h」作爲包含項,而在單獨項目中使用。 –
2010-11-07 18:23:01