プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
C言語、#includeを書く際の囲み文字「<>(山括弧)」と「""(ダブルクォート)」の違いについて。
結論から書けば

<>(山括弧)→探査パスにカレントディレクトリを含めない
""(ダブルクォート)→探査パスにカレントディレクトリを含める

です。

それでは詳細を書いていきます。

超久しぶりにC言語でプログラムを組んだのですが、素朴な疑問が出てきました。

#include <hoge.h>



#include "hoge.h"

の違いはなんだべ(--?

今まで決まり文句のように

#include <stdio.h>

と書いていたので、あんま深く考えたこと無かったんですよね(--ゞ

思い立ったが吉日です。早速、調べてみました。

ふむふむ(--)

#include <hoge.h>

はパスが通ってるところから「hoge.h」を探してくれるそうです。

一方の

#include "hoge.h"

は、まずカレントディレクトリを探します。
それで見つからなかったら、パスが通ってるところを探してくれるのだそーな。

早速、実験してみますかね。

まずは空ファイルの「hoge.h」を作って適当なディレクトリに置き、
同じディレクトリ内に以下の内容の「test.c」を置きましたφ(--)
■test.c
#include <stdio.h>
#include <hoge.h>

int main(){
    printf("Hello World\n");
}

コンパイルしてみた結果はこちらφ(--)

test.c:2:18: error: hoge.h: No such file or directory

おぉ、見事にエラーになりやがったぜい。
「hoge.h」が見つからなかったのね。

次にtest.cの中身を「<hoge.h>」から「"hoge.h"」に変更φ(--)

#include <stdio.h>
#include "hoge.h"

int main(){
    printf("Hello World\n");
}

今度はちゃんとコンパイルが通りました。
カレントディレクトリも探してくれたのですね。

当たり前ですが「<stdio.h>」から「"stdio.h"」に変えても動きます。
これでもきちんとコンパイルが通りましたφ(--)

#include "stdio.h"
#include "hoge.h"

int main(){
    printf("Hello World\n");
}

ふむふむ(--)

#include "stdio.h"

でも動きますよっと。
でも参考書とかを見ると、決まり文句のように

#include <stdio.h>

と書いてありますよね。

一瞬、何でかなー?と思ったのですが、きっと余計なことをさせないためなんでしょうね。
「""(ダブルクォート)」で囲った場合、まずはカレントディレクトリを探しにいきます。
そして無かった場合、パスが通っているところを探しに行きます。
「stdio.h」とかは普通わざわざカレントディレクトリに置かないですもんね。
「どーせ無いんだから、わざわざ探す必要なかろーが」ということで
「<>(山括弧)」で囲むのが決まり文句になっているのでしょう。

ふむ(--)

てことは、自分で作ったヘッダファイルは「""(ダブルクォート)」囲みもありうるけど、
標準で用意されているヘッダファイルは「<>(山括弧)」の方が良さ気ですね。
微々たる差でしょうが、カレントディレクトリを探す分、余計なお仕事だろうし。

あるいはincludeの書き方は「<>(山括弧)」囲みで統一して、
自前で用意したヘッダファイルにはパスを通すようにした方が無難かな(--?

……まぁ、いいや。

最後にもう一度まとめておきますね。
「""(ダブルクォート)」囲みでincludeすると、カレントディレクトリも探します。
「<>(山括弧)」囲みでincludeすると、カレントディレクトリは探しません。

完了\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:● C言語  thema:システム開発 - genre:コンピュータ  Posted by ササキマコト 

  関連記事