LoginSignup
59

More than 5 years have passed since last update.

C++の標準ライブラリを一行で一括でインクルードする

Last updated at Posted at 2015-05-17
#include <bits/stdc++.h>

このヘッダファイルはgccを入れると一緒についてくる。中身は次を参照のこと。
https://gcc.gnu.org/onlinedocs/gcc-4.9.2/libstdc++/api/a01220_source.html

標準ライブラリを一発でインクルードできるので、競技プログラミングなどの場面では面倒が省けてよい。

OSXやVC++では使えない?

OSXのCommand Line Toolsで手に入るgccコマンドは、実はclangにオプションをつけたエイリアスになっている。gccが入っていないので、上記のヘッダファイルも提供されていない。

VisualStudioのVC++でもやはり提供されていないので、デフォルトでは使用することができない。

だが、便利なものは使いたい。なんとかしよう。

対処する

1. gccを手に入れる

gccに付属しているのでこれが一番手っ取り早い。
homebrew等のパッケージマネージャを用いる場合は、パスの参照順に影響を受けがちである。gcc -vwhich gccにより自分が使っているgccが今インストールしたものかどうか確かめること。

2. bits/stdc++.h を作ってインクルードパスに含める

いくつか実現方法がある。

2.1 親ディレクトリに置く

親ディレクトリにディレクトリbitsを作り、その中にstdc++.hを配置する方法がある。この方法の場合、

#include "bits/stdc++.h"

のように、ダブルクォートで囲う必要がある。

ダブルクォートと山括弧の間には、#includeを記載したファイルの親ディレクトリを起点とした検索をするかしないかの違いがある。つまり、gccでコンパイルするようなジャッジサーバにこの記法でbits/stdc++.hをインクルードしたコードを送っても問題ない。

しかし、コードを書く場所が異なればそのたびに配置しなければならず、面倒である。
また上述の理由から、山括弧でbits/stdc++.hを参照している他者のコードがそのままでは動かない。面倒である。

2.2 インクルードパスを増やす

適当な場所にbits/stdc++.hを配置し、そのディレクトリをインクルードパスとして指定することで、山括弧でも参照できるようになる。
/path/to/parent/dir/bits/stdc++.hに配置したとしよう。

2.2.1 コンパイルするときにオプションで指定する
$ g++ -I/path/to/parent/dir main.cpp

と書けば、

#include <bits/stdc++.h>

と書くことができる。

2.2.2 環境変数に書いておく

CPLUS_INCLUDE_PATH環境変数に書いておくと、インクルードパスに含めてコンパイルしてくれる。オプションで指定するよりもっと楽だろう。既に値が入っている場合は、PATHと同様の記法で複数のパスを書くことができる。

.bash_profileあたりに次のように書くことになる。

export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/path/to/parent/dir

注意すべきこと

先進的な機能に関するライブラリのインクルードが含まれている場合があるので、自分が今使っているコンパイラがそれらの機能に対応しているかを確かめておく必要がある。
2015年時点では<future>や<atomic>が該当するだろう。未対応のコンパイラでこういった項目をインクルードしているとコンパイルエラー等の問題が発生する。

参考

clang(1) - Linux man page
http://linux.die.net/man/1/clang

C/C++の#includeディレクティブの" "と< >の違い - HIDARI日記(右)
http://hidari-lab.hatenablog.com/entry/2013/03/20/235242

Useful C++ "library" - Codeforces"
http://codeforces.com/blog/entry/8387

homebrewでgcc4.9を入れたお話 - ぱーぽーのぷろぐらみんぐ記
http://purple-jwl.hatenablog.com/entry/20140706/1404655974

VisualStudioでもbits/stdc++.hでC++のヘッダファイルを一括インクルードしたい!
http://qiita.com/tosaka2/items/a52e065fb23613f70c63

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
59