2012-12-03 1 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)

は基本的に、これは<>が特定の名前を持つヘッダが見つかった場合、""同じ名前有するヘッダを見つけるために失敗しないことを意味します。


これらの実装で定義された場所は、両方の形式に同じである必要はありません。

これらの検索ライブラリフォルダの1つと他の検索ライブラリフォルダの1つがTUのフォルダを検索する必要はありません。コンパイラはファイルシステム全体を検索することができ、必要であればGoogleで検索することもできます。

これは、常に同じヘッダーを見つけることを意味するものではありません。

+0

しかし、 '#include" xxx "'が失敗すると、コンパイラは '#include 'のように再処理しなければならないという要件があります。 –

+0

@Jamesそれは、私が3番目の文を意味するものです。私はそれを言い換えるべきだと思いますか、それともそれを見逃しましたか? –

+0

+1私はグーグルソースファイルのために:-) – Angew

0

これは、インクルード構文がどのように定義されているかによるものです。

#include <cstdio>は、コンパイラが

#include "cstdio" cstdioを標準ライブラリには、コンパイラが現在のディレクトリに主に見て、フォールバックとして標準ライブラリの場所を使用して、ファイル「cstdioを」を見つけることを試みるべきであることを意味含めるべきであることを意味し。

+2

'#include <>'か '#include" "'が現在のディレクトリ内で最初に見えるかどうかは、完全に実装定義されているかどうかです。 –

0

""<>は、検索の順番を変更します。

#include <stdio.h> 

周りに他の方法であるのに対し

ので

#include "stdio.h" 

でプリコンパイラは、翻訳単位のディレクトリから検索を開始し、その後、事前に定義されたに移動したディレクトリ

「を含みます」

+0

@CharlesBaileyしかし実際には、 "..."インクルードはインクルードファイルを含むディレクトリを最初に調べるべきであるということは一般に認められています。 (一方、 '-I'を渡すか、それが読み込まれているファイルがカレントディレクトリにある場合を除いて、コンパイラはインクルードのために現在のディレクトリを調べるとは思わない) –

+0

@CharlesBailey、私は**現在**ディレクトリについて何か言ったのですか? –

+0

@aleguna:申し訳ありません。「現在のディレクトリ」は、翻訳された翻訳単位の最初のソースファイルを含むディレクトリです。私は怠け者だった。 –

関連する問題