2012-12-03 98 views
5

可能重複:
What is the difference between #include <filename> and #include 「filename」?爲什麼#include「stdio.h」有效?

當我寫了下面爲什麼不抱怨編譯:

#include "stdio.h" 

它不應該是

#include <stdio.h> 

而不是,因爲stdio.h實際上存儲在庫文件夾中,而不是存儲在翻譯單元的文件夾中?爲什麼它工作呢?

+1

'「...」'看起來在本地*先*,然後在其他地方。 – BoBTFish

+1

不,它應該是'#inlcude ' – 111111

+1

http://stackoverflow.com/questions/21593/what-is-the-difference-between-include-filename-and-include-filename – BoBTFish

回答

8

""<>之間的差異並不大。兩者都在實現定義的位置搜索頭文件1,2。不同之處在於,如果""搜索失敗,搜索就會發生,就好像它使用的是<>。 (§16.2)

基本上,這意味着如果發現<>的報頭具有特定名稱,""不會失敗找到具有相同名稱的報頭。


這些實現定義的地方都沒有成爲這兩種形式是相同的。

沒有要求其中一個搜索庫文件夾和另一個搜索TU的文件夾。如果需要的話,編譯器可以搜索整個文件系統甚至谷歌。

雖然這並不意味着它們總是找到相同的標題。

+0

但是有一個要求,如果'#include「xxx」'失敗,編譯器會重新處理它,就好像它已經'#include '一樣。 –

+0

@詹姆斯這就是我打算第三句話的意思。你認爲我應該改寫它,還是你錯過了? –

+0

對於谷歌搜索源文件+1 :-) – Angew

0

這是因爲include語法是如何定義的。

#include <cstdio>意味着編譯器應該包括標準庫cstdio

#include "cstdio"意味着編譯器應該嘗試找到文件「cstdio」,主要是在當前目錄中查找並使用標準庫的位置作爲備用。

+2

無論是「#include」還是「#include」「'查看當前目錄中的所有內容,都完全由實現定義。 –

0

""<>只改變查找順序。所以用

#include "stdio.h" 

預編譯器將翻譯單元的目錄開始查找,然後移動到預定義的「包括」目錄

#include <stdio.h> 

是周圍的其他方式

+0

@CharlesBailey但在實踐中,通常認爲「...」包括應首先查看包含include文件的目錄。 (另一方面,我認爲任何編譯器都不會在當前目錄中查找包含,除非您通過'-I.'或正在讀取的文件位於當前目錄中。) –

+0

@CharlesBailey,其中我有沒有說** ** current **目錄? – 2012-12-03 13:50:07

+0

@aleguna:對不起,對於「當前目錄」,請閱讀「包含正在編譯的翻譯單元的初始源文件的目錄」。我很懶。 –

相關問題