【C++】#includeの””と<>の違いをわかりやすく解説

サムネイル画像 C++

今回は、C++の#includeで使う“”(ダブルクォート)と<>(山括弧)の違いと使い分けについて解説していきます。

この記事を読み終えると、あなたは#includeの書き方で迷わなくなると思いますので、ぜひ最後まで読んでいただけると嬉しいです。

こんな疑問はありませんか?

  • #include <iostream>#include "MyClass.h" の書き方が違うけど、どう使い分けるの?
  • 自作のヘッダーファイルを <> で書いたらエラーになった…
  • "" で標準ライブラリを書いたら動いたけど、これでいいの?

ルールを理解すれば迷わなくなります。一緒に見ていきましょう!

<> と “” の基本的な違い

結論からいうと、

<>(山括弧):標準ライブラリや外部ライブラリのヘッダーを読み込むときに使う
""(ダブルクォート):自分で作ったヘッダーファイルを読み込むときに使う

です。

違いの本質は「どこを検索してファイルを探すか」にあります。

書き方ファイルを探す場所主な用途
#include <ファイル名>コンパイラのシステムパスのみ標準ライブラリ・外部ライブラリ
#include "ファイル名"まず現在のファイルと同じフォルダ → 次にシステムパス自作のヘッダーファイル

検索パスの違いをもう少し詳しく

<> の場合

<>を使うと、コンパイラはあらかじめ設定されたシステムのインクルードパスだけを検索します。

このパスにはC++の標準ライブラリ(iostreamvectorstringなど)が入っています。自分で作ったファイルはここに入っていないため、自作ヘッダーを <> で書くとエラーになることがほとんどです

“” の場合

""を使うと、コンパイラはまずそのソースファイルと同じフォルダを検索し、見つからなければシステムのインクルードパスも検索します。

そのため、自分で作った Player.h などは "" で書けば確実に見つけてもらえます。

実際のコードで確認してみよう

次のような2ファイル構成で試してみましょう。

▼Hello.h


#pragma once
#include <iostream>  // 標準ライブラリ → <>

inline void hello() {
    std::cout << "Hello from my header!\n";
}

▼main.cpp


#include <iostream>  // 標準ライブラリ → <> を使う
#include "Hello.h"   // 自作ヘッダー  → "" を使う

int main() {
    hello();
    return 0;
}

実行結果

Hello from my header!

<iostream> は標準ライブラリなので <>、自作の Hello.h"" で書いていますね。これが基本の使い分けです。

なお、ヘッダーファイルを作る際の #pragma once やプロトタイプ宣言についてはこちらの記事で詳しく解説しています。

サブフォルダにあるヘッダーを読み込む場合

プロジェクトが大きくなると、ヘッダーファイルをフォルダで整理したくなります。その場合は "" の中に相対パスで書くだけでOKです。

たとえば、フォルダ構成がこうなっているとします。

project/
├── main.cpp
├── Player.h
└── Enemy/
    └── Boss.h

この場合、main.cpp からそれぞれをインクルードするにはこう書きます。


#include "Player.h"       // 同じフォルダにある
#include "Enemy/Boss.h"   // Enemyフォルダの中にある

"" の中はソースファイルからの相対パスで書けばOKです。/(スラッシュ)でフォルダを区切ります。Windowsでも \ より / を使う方が安全です。

<> と “” のよくある失敗例と解決策

① 自作ヘッダーを <> で書いてエラーになる

最も多い間違いです。自分で作った .h ファイルを <> で書いてしまうケースです。


// ❌ 自作ヘッダーを <> で書いてしまう
#include <Player.h>   // fatal error: Player.h: No such file or directory

// ✅ 自作ヘッダーは "" で書く
#include "Player.h"   // OK

解決策:自分で作ったヘッダーは必ず "" を使いましょう。「標準ライブラリは <>、自作は ""と覚えておけばOKです。

② サブフォルダのヘッダーでパス指定を忘れる

フォルダを整理したあと、パスの書き方を更新し忘れるミスです。


// ❌ Boss.h が Enemy/ フォルダに移動したのにパスを直し忘れ
#include "Boss.h"          // エラー!見つからない

// ✅ フォルダを含めた相対パスで書く
#include "Enemy/Boss.h"    // OK

解決策:ファイルを別フォルダに移動したときは、インクルードのパスもあわせて更新しましょう。

③ “” で標準ライブラリを書いてしまう

#include "iostream" のように標準ライブラリを "" で書いても、多くの環境では動いてしまいます。しかしこれは非推奨です。


// ❌ 動くことがあるが非推奨
#include "iostream"

// ✅ 標準ライブラリは <> で書くのが正しい
#include <iostream>

解決策"" で書いても動く環境があるのは、コンパイラが最終的にシステムパスも検索するためです。しかしコードを見た人が混乱するので、標準ライブラリは必ず <> で書きましょう。

まとめ

#include<>"" の使い分けをまとめます。

  • <>(山括弧):コンパイラのシステムパスを検索。標準ライブラリ・外部ライブラリに使う
  • ""(ダブルクォート):まずカレントディレクトリを検索。自作のヘッダーファイルに使う
  • サブフォルダのヘッダーは "" 内に相対パスで書く(例:"Enemy/Boss.h"
  • 自作ヘッダーを <> で書くと他のPCで動かない場合がある
  • 標準ライブラリを "" で書いても動くことはあるが、可読性のために <> を使うのがお作法

標準ライブラリは <>、自作は ""」この1行さえ覚えておけば、インクルードで迷うことはなくなります!

ここまで読んでくださり、ありがとうございました。

この記事が皆様の学習に役立てば幸いです。

関連記事