c++ - make - write.h file
#include<filename>和#include“filename”有什麼區別? (20)
the " < filename > " searches in standard C library locations
whereas "filename" searches in the current directory as well.
Ideally, you would use <...> for standard C libraries and "..." for libraries that you write and are present in the current directory.
在C和C ++編程語言中,在括號中使用尖括號和使用引號之間有什麼區別,如下所示?
-
#include <filename>
-
#include "filename"
#include <filename>
當您要使用C / C ++系統或編譯器庫的頭文件時使用。 這些庫可以是stdio.h,string.h,math.h等。
#include "path-to-file/filename"
當你想使用你自己的自定義頭文件在你的項目文件夾或其他地方使用。
有關預處理器和標題的更多信息。 閱讀C - 預處理器 。
GCC文件說明了以下兩者之間的區別:
使用預處理指令
'#include'
包含用戶和系統頭文件。 它有兩個變種:
#include <file>
這個變體用於系統頭文件。 它在系統目錄的標準列表中搜索名為file的文件。 您可以使用
-I
選項將目錄添加到此列表中(請參閱Invocation )。
#include "file"
這個變體用於你自己程序的頭文件。 它在包含當前文件的目錄中首先搜索名為file的文件,然後在quote目錄中搜索用於
<file>
的相同目錄。 您可以使用-iquote
選項將目錄添加到引用目錄列表中。'#include'
的參數,不管是用引號還是尖括號分隔,都像字符串常量一樣,註釋不被識別,而且宏名稱不被擴展。 因此,#include <x/*y>
指定包含名為x/*y
的系統頭文件。但是,如果文件內出現反斜杠,它們將被視為普通文本字符,而不是轉義字符。 處理C中不適合字符串常量的字符轉義序列。 因此,
#include "x\n\\y"
指定一個包含三個反斜杠的文件名。 (有些系統將'\'解釋為一個路徑名分隔符,所有這些也都以同樣的方式解釋'/'
,它最容易使用'/'
。)如果文件名後面有任何內容(註釋除外),則為錯誤。
#include <file>
tells the compiler to search for the header in its includes directory, eg for MinGW the compiler would search for file
in C:\MinGW\include\ or wherever your compiler is installed.
#include "file"
tells the compiler to search the current directory (ie the directory in which the source file resides) for file
.
You can use the -I
flag for GCC to tell it that, when it encounters an include with angled brackets, it should also search for headers in the directory after -I
. For instance, if you have a file called myheader.h
in your own directory, you could say #include <myheader.h>
if you called GCC with -I .
(indicating that it should search for includes in the current directory.)
<file>
include指示預處理器首先在-I
目錄和預定義目錄中搜索,然後在.c文件的目錄中搜索。 "file"
包含告訴預處理器首先搜索源文件的目錄,然後恢復為-I
並預定義。 無論如何都會搜索所有目的地,只有搜索順序不同。
2011年標準主要討論“16.2源文件包含”中的包含文件。
2表單的預處理指令
# include <h-char-sequence> new-line
搜索一系列實現定義的位置,以找到由<和>分隔符之間的指定序列唯一標識的標頭,並使標頭的全部內容替換該指令。 如何指定位置或標識的是實現定義的。
3表單的預處理指令
# include "q-char-sequence" new-line
導致用指定序列標識的源文件的全部內容替換該指令,該指定序列在“分隔符”之間,以實現定義的方式搜索指定的源文件,如果不支持該搜索,或者搜索失敗,該指令被重新處理,就像它讀取一樣
# include <h-char-sequence> new-line
與原始指令相同的包含序列(包括>字符,如果有的話)。
請注意,如果未找到文件,則"xxx"
格式會降級為<xxx>
格式。 其餘的是實現定義的。
The order of search header files is different. <XXX.h> prefer to search the standard headers first while "XXX.h" searches the workspace's header files first.
When you use #include <filename>, the pre-processor looking for the file in directtory of C\C++ header files (stdio.h\cstdio, string, vector, etc.). But, when you use #include "filename": first, the pre-processor looking for the file in the current directory, and if it doesn't here - he looking for it in the directory of C\C++ header files.
包含尖括號的#include將搜索要包含的文件的“依賴於實現的位置列表”(這是一種非常複雜的方式來表示“系統標題”)。
帶引號的#include將只搜索一個文件(和,“以與實現相關的方式”,bleh)。 這意味著,在正常的英語中,它會嘗試應用您在其上折騰的路徑/文件名,並且不會預先添加系統路徑或以其他方式篡改系統路徑。
另外,如果#include“”失敗,它將被標準重新讀為#include <>。
g++有一個(特定於編譯器的)描述,儘管它是特定於gcc而不是標準,但比ISO標準的律師風格的討論更容易理解。
在引用系統文件時使用#include <filename>
。 這是一個可在系統默認位置(如/usr/include
或/usr/local/include
找到的頭文件。 對於需要包含在另一個程序中的自己的文件,您必須使用#include "filename"
語法。
它確實:
"mypath/myfile" is short for ./mypath/myfile
與.
是包含#include
的文件的目錄,和/或編譯器的當前工作目錄,和/或default_include_paths
和
<mypath/myfile> is short for <defaultincludepaths>/mypath/myfile
如果./
在<default_include_paths>
,那麼它沒有區別。
如果mypath/myfile
位於另一個包含目錄中,則行為未定義。
對於#include“文件名”,預處理程序在與包含該指令的文件相同的目錄中搜索。 此方法通常用於包含程序員定義的頭文件。
對於#include預處理程序以實現相關的方式進行搜索,通常在由編譯器/ IDE預先指定的搜索目錄中進行搜索。 This method is normally used to include standard library header files.
對於#include ""
,編譯器通常會搜索包含該文件的文件的文件夾,然後搜索其他文件夾。 對於#include <>
,編譯器不搜索當前文件的文件夾。
按照標準 - 是的,它們是不同的:
表單的預處理指令
#include <h-char-sequence> new-line
搜索一系列實現定義的位置,以找到由
<
和>
分隔符之間的指定序列唯一標識的標頭,並使標頭的全部內容替換該指令。 如何指定位置或標識的是實現定義的。表單的預處理指令
#include "q-char-sequence" new-line
導致用指定序列標識的源文件的全部內容替換該指令,該指定序列在
"
分隔符"
之間,以實現定義的方式搜索指定的源文件,如果不支持該搜索,或者搜索失敗,該指令被重新處理,就像它讀取一樣#include <h-char-sequence> new-line
與原始指令相同的包含序列(包括
>
字符,如果有的話)。表單的預處理指令
#include pp-tokens new-line
(不符合前兩種形式之一)是允許的。
include
在指令中的預處理標記與正常文本中的處理方式相同。 (當前被定義為一個宏名稱的每個標識符被替換為預處理標記的替換列表所取代。)所有替換之後產生的指示應與前兩個表單中的一個匹配。 一個<
和一個預處理標記對或一對"
字符之間的預處理標記序列組合為單個標頭名稱預處理標記的方法是實現定義的。定義:
h-char:源字符集中除換行符和
>
之外的任何成員q-char:源字符集的任何成員,除了換行符和
"
請注意,該標準沒有說明實現定義的方式之間的任何關係。 第一種形式是以一種實現定義的方式搜索,另一種以(可能是其他)實現定義的方式搜索。 該標準還規定應存在某些包含文件(例如, <stdio.h>
)。
形式上,你必須閱讀你的編譯器的手冊,但是通常(通過傳統) #include "..."
形式搜索首先找到#include
的文件的目錄,然後搜索#include <...>
表單搜索(包含路徑,例如係統標題)。
簡單的通用規則是使用斜角括號來包含編譯器附帶的頭文件。 使用雙引號包含任何其他頭文件。 大多數編譯器都是這樣做的。
1.9 - 頭文件更詳細地解釋了預處理器指令。 如果你是一位新手程序員,該頁面應該可以幫助你理解所有這些。 我從這裡學到了東西,而且我一直在工作。
要知道的唯一方法是閱讀你的實現文檔。
在C標準中 ,第6.10.2節第2至4款規定:
表單的預處理指令
#include <h-char-sequence> new-line
搜索一系列實現定義的位置,以找到由
<
和>
分隔符之間的指定序列唯一標識的標頭,並使標頭的全部內容替換該指令。 如何指定位置或標識的是實現定義的。表單的預處理指令
#include "q-char-sequence" new-line
導致用指定序列標識的源文件的全部內容替換該指令,該指定序列在
"
分隔符"
之間,以實現定義的方式搜索指定的源文件,如果不支持該搜索,或者搜索失敗,該指令被重新處理,就像它讀取一樣#include <h-char-sequence> new-line
與原始指令相同的包含序列(包括
>
字符,如果有的話)。表單的預處理指令
#include pp-tokens new-line
(不符合前兩種形式之一)是允許的。
include
在指令中的預處理標記與正常文本中的處理方式相同。 (當前被定義為一個宏名稱的每個標識符被替換為預處理標記的替換列表所取代。)所有替換之後產生的指示應與前兩個表單中的一個匹配。 一個<
和一個預處理標記對或一對"
字符之間的預處理標記序列組合為一個標頭名稱預處理標記的方法是實現定義的。定義:
h-char:源字符集中除換行符和
>
之外的任何成員q-char:源字符集的任何成員,除了換行符和
"
謝謝你的出色答案,尤其是 Adam Stelmaszczyk和piCookie,以及aib。
和許多程序員一樣,我使用了對應用程序特定文件使用"myApp.hpp"
表單的非正式慣例,以及針對庫和編譯器系統文件(即/I
和INCLUDE
環境變量中指定的文件)的<libHeader.hpp>
表單,多年來認為這是標準。
但是,C標準規定搜索順序是特定於實現的,這可能使得可移植性變得複雜。 更糟糕的是,我們使用jam,它會自動計算出包含文件的位置。 您可以使用相對或絕對路徑作為包含文件。 即
#include "../../MyProgDir/SourceDir1/someFile.hpp"
較舊版本的MSVS需要雙反斜杠(\\),但現在不需要。 我不知道什麼時候改變了。 只需使用正斜杠與'nix(Windows將接受)兼容即可。
如果你真的擔心它,使用"./myHeader.h"
作為包含文件與源代碼位於同一目錄中(我當前的非常大的項目有一些重複的包含文件名 - 這實際上是一個配置管理問題)。
為了您的方便,這裡複製了MSDN的解釋 )。
引用表格
預處理器按以下順序搜索包含文件:
- 在與包含#include語句的文件相同的目錄中。
- 在當前打開的包含文件的目錄中,按照與其相反的順序
他們被打開了。 搜索從父包含文件的目錄開始
通過任何祖父母包含文件的目錄繼續向上。- 沿著由每個
/I
編譯器選項指定的路徑。- 沿著由
INCLUDE
環境變量指定的路徑。角支架形式
預處理器按以下順序搜索包含文件:
- 沿著由每個
/I
編譯器選項指定的路徑。- 在命令行上進行編譯時,沿著由
INCLUDE
環境變量指定的路徑進行編譯。
這裡的許多答案都集中在編譯器為了找到文件而搜索的路徑上。 雖然這是大多數編譯器所做的事情,但是符合標準的編譯器可以使用標準頭文件的效果進行預編程,並將#include <list>
當作交換機來處理,而且它不需要作為文件存在。
這不是純粹的假設。 至少有一個編譯器可以這樣工作。 建議僅在標準頭文件中使用#include <xxx>
。
#include <filename> (1)
#include "filename" (2)
#include
包含由文件名標識的源文件,該文件緊接在該指令之後的行中的當前源文件中。
該指令的第一個版本僅搜索標準包含目錄。 標準C ++庫以及標準C庫隱式包含在標準包含目錄中。 標準include目錄可以由用戶通過編譯器選項來控制。
第二個版本首先搜索當前文件所在的目錄,並且只有在未找到該文件時才搜索標準包含目錄。
在沒有找到該文件的情況下,該程序不合格。
#include <abc.h>
用於包含標準庫文件。 所以編譯器會檢查標準庫標題所在的位置。
#include "xyz.h"
會告訴編譯器包含用戶定義的頭文件。 因此編譯器會檢查當前文件夾或-I
定義的文件夾中的這些頭文件。
-
#include <>
用於預定義的頭文件
如果頭文件是預定義的,那麼您只需將頭文件名寫在尖括號中,它看起來像這樣(假設我們有一個預定義的頭文件名iostream):
#include <iostream>
-
#include " "
用於程序員定義的頭文件
如果你(程序員)編寫了你自己的頭文件,那麼你會用引號將頭文件名寫入。 所以,假設你寫了一個名為myfile.h
的頭文件,那麼這是一個如何使用include指令來包含該文件的例子:
#include "myfile.h"