2011-01-22 90 views
1

this tutorial它提到以下有關#include "filename"C++ - #包括「文件名」

的#include「文件名」告訴編譯器來查找該文件中 目錄包含做着#源文件 包括。 如果失敗, 將相同作用於傾斜 括號情況

什麼意思是粗體的字體句子?

謝謝。

回答

4

雖然確切細節是實現相關的,也有一些共同的做法。在最常見的編譯器,使用#include "filename.h"默認搜索當前目錄的報價。使用尖括號#include <filename.h>搜索系統定義的庫目錄。這是說,如果當前目錄沒有你需要的文件,它會搜索系統目錄。

注意,一些編譯器可能是不同的,你的編譯器本身可能有選項來改變這些目錄。另外還有一點系統頭實際上並不存在的可能性,但#include <foo.h>直接由編譯器識別,以實現特定的內置的定義。

+0

因爲您已被接受,我是否可以建議您更改答案以正確定義查找頭文件的位置。在標準方面,它的實現已經定義。或者至少說明查看當前目錄是常見做法,但決不是強制性的。這不是酸葡萄,我只是厭惡不正確的接受答案。如果你解決了這個問題,我會很高興得到讚揚。 – paxdiablo 2011-01-22 09:30:30

+0

paxdiablo:多種答案的美妙之處在於你不必將所有東西都打包成一個。 – 2011-01-22 21:40:47

10

粗體位僅表示如果使用"方法無法定位引號中指定的文件,則它將恢復爲<>方法。


我應該指出,關於它會查找include文件的傳輸是實際上是不正確。在兩種箱子(引號和尖括號),搜索位置是實現定義。

lex.header部分:

在這兩種形式的報頭的名稱的序列被映射在一個實現定義的方式標頭或作爲在16.2指定的外部源的文件名。

16.2部分如下:


#include一個指令應識別可以由執行被處理的報頭或源文件。

形式的預處理指令

# include < h-char-sequence> new-line 

搜索用於由<>定界符之間的指定序列唯一標識的報頭實現定義的地方的序列,並且使由所述置換該指令的標題的全部內容。如何指定位置或標識的是實現定義的。

形式

# include " q-char-sequence" new-line 

的預處理指令使得由"定界符之間的指定序列所標識的源文件的全部內容替換該指令的。指定的源文件是以實現定義的方式搜索的。如果該搜索不被支持,或者如果搜索失敗,則該指令被處理是否它與含有相同序列讀

# include < h-char-sequence> new-line 

從原始指令(包括>字符,如果有的話)重新處理。


所以聲明"... tells the compiler to look for the file in directory containing the source file doing the #include ..."是錯誤的。在這兩種情況下,完全取決於如何找到文件。

話雖如此,其餘都是正確的。如果"類型使用的方法未找到標題,則使用<>類型使用的方法。這實際上都是大膽的意思。

你只需要閱讀你的特定實現的文檔,看看這些方法是什麼。