こんにちは。
競プロではC++が強いそうですね。
C++ではインクルードファイルとして
#include <iostream> //入出力 #include <string> //文字列 #include <vector> //配列 ...
等々書くそうですが、面倒なのでAtCoderでは<bits/stdc++.h>
を使うと良い、という話になっています。
これは、gccに付属する、諸々のインクルードファイルを一気に読み込むためのファイルだそうです。つまり
#include <bits/stdc++.h>
とかけば済むということです。
しかし、macでは使えないそうです(参考文献参照)。
これを、makefileを活用して楽に使えるようにしてみました。
ファイル構造
abc150/a.cpp
をコンパイルしてみたいと思います。
@AtCoder | |-- abc150 | |-- a.cpp | |-- bits | |-- stdc++.h | |-- makefile
ちなみに上のa.cppはA - 500 Yen CoinsにACで通過します(それはそう)。
コンパイルしてみる
- 環境
macOS Mojave バージョン10.14.6
Visual Studio Code バージョン1.44.2
(環境について何をかけば良いのかあんまりわかってないので不十分かも。ごめんなさい)
普通にコンパイルすると
$ cd .../@AtCoder $ c++ abc150/a.cpp
↓
abc150/a.cpp:1:10: fatal error: 'bits/stdc++.h' file not found #include <bits/stdc++.h> ^~~~~~~~~~~~~~~ 1 error generated.
怒られた。元々のインクルードパスにbits/stdc++.hが無いですよ、ということ。
bits/stdc++.hの準備
ここ↓にあります
libstdc++: stdc++.h Source File
これをコピペして@AtCoder/bits/stdc++.h
に保存します。(行番号もコピーしてしまうので頑張って消した)
参考文献にあるように、コンパイル時にインクルードパスを指定してコンパイルすれば良いので
$ c++ -I /Users/.../@AtCoder abc150/a.cpp
これで一応はコンパイルできます。
簡単にする
毎回インクルードパスを書くのは面倒なのでmakefileを作ってそこに書いておきましょう。
ということで、冒頭にも置きましたが
# .../@AtCoder/makefile %: %.cpp c++ -I /Users/.../@AtCoder $< -o $@
これだけ。ちなみに2行目の頭の空白は、スペースではなく「タブ」でなくてはいけません。
それでもって
$ make abc150/a
でコンパイル(拡張子.cpp
をつけないことに注意)。実行は
$ abc150/a
です。
おまけ-Cのファイルとの共存
もともとabc150/a.c
があった場合、今まではmake abc150/a
でコンパイルできたのが、makefileの変更によってmake abc150/a
ではc++のファイルがコンパイルされてしまいます。
makefileを改良して
%pp: %pp.cpp c++ -I /Users/.../@AtCoder $< -o $@
とし、c++のファイルはapp.cpp
, bpp.cpp
のようにファイル名の方にもpp
をつけてやるとa.c
, b.c
との共存が図れます。
まあ、cをコンパイルするときは先に移動しておけば良いんですけどね
$ cd abc150 $ make a (a.cコンパイル) $ ./a (実行)
参考文献
Qiitaにも書いてみました