🪡

【C++】AtCoderローカルテスト環境構築【VSCode】

2023/05/06に公開約3,200字

ローカルで、C++コードのコンパイル・テストができる環境を構築しました。

想定環境

Windows 11

MinGWのインストール

g++を有効にしてください。
未の場合、こちらのURLを参考に。
https://www.javadrive.jp/cstart/install/index6.html

VSCodeのインストール

未の場合、こちらのURLからインストール。
https://azure.microsoft.com/ja-jp/products/visual-studio-code/

VSCodeのシェルをbashに変更

こちらのURLを参考に、WSLを有効にし、VSCodeのターミナルをbashにしてください。
https://tenshoku-miti.com/takeshi/windows-vscode-ternimal-ubuntu/

※bashにする理由
Windows PowerShellのままだと、AtCoder Libraryを使用する場合に、コンパイルエラーが大量に出ます。
参考URL:
https://mmnkblog.hatenablog.com/entry/2020/10/22/032125
回避する方法を試しても、コードによってはエラーが出てしまうので、bashにしてしまったほうが楽だと思います。
AtCoder Libraryを使用しない場合はお好みです。個人的には何かとbashの方が便利なので、設定推奨。

コンパイルしてみる

VSCodeのワーキングディレクトリに、hello.cpp作りましょう。

hello.cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
    cout << "Hello, World!" << endl;
}

以下のコマンドを、VSCodeのターミナルに打ち込んで、コンパイルします。
※ファイルが見つからない等出る場合、フォルダやファイルの場所・名前を確認してみてください。

g++ hello.cpp -std=c++17

以下のコマンドで、コンパイルしたファイルを実行します。

./a.out

「Hello, World!」が表示されたら成功です。

標準入力を読み込んで実行

in.txtを作りましょう。

in.txt
GoodBye

hello.cppを以下のように書き換えます。

hello.cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
    string s;
    cin >> s;
    cout << s << ", World!" << endl;
}

以下のコマンドを、VSCodeのターミナルに打ち込んで、コンパイルします。

g++ hello.cpp -std=c++17

以下のコマンドで、コンパイルしたファイルを実行します。
< ./in.txtのようにすることで、in.txtを標準入力として受け取れます。

./a.out < ./in.txt

「GoodBye, World!」が表示されたら成功です。

in.txtを書き換えれば、他の標準入力も試せます。
例えば、in.txtを「Hello」に書き換えて保存したら、再度./a.out < ./in.txtを実行してみてください。「Hello, World!」が表示されます。

今後、ローカルでテストする際は、

  1. C++のコードを書く
  2. g++ ファイル名 -std=c++17でコンパイル
  3. in.txtに標準入力を書き込む
  4. ./a.out < ./in.txtでテスト実行

のように行えます。
コンパイル・実行は、ファイル保存後に行ってください。最後に保存した状態でコンパイル・実行されます。

カスタマイズ

ここからはオプションなので、気に入ったものがあれば導入してみてください。

後述しますが、最終的に私のコンパイルコマンドは以下のようにしました。

g++ $F.cpp -std=c++17 -o out.out -I /mnt/c/Users/rare/git/training-atcoder/ac-library

また、エイリアス設定で簡易に実行できるようにもしています。

実行ファイル名を指定してコンパイル

ファイル名がa.outだと、並び順が気に食わなかったので、指定します。
-oオプションを使用してください。

g++ hello.cpp -std=c++17 -o out.out

out.outはセンス無いと思うので、test.exeなどがいいですね多分。お好みで。
テスト実行する際は、./out.out < ./in.txtのように、a.outの箇所を変えるだけです。

コンパイル対象ファイルを変数化

例えば、hello.cppをコンパイルする場合、こうします。

F=hello #ファイル名を変数Fに代入
g++ $F.cpp -std=c++17

ACLを含んでコンパイル

ACLを使用する場合、-Iオプションでatcoderフォルダのパスを指定します。
ACLドキュメントにも記載あります。
https://atcoder.github.io/ac-library/document_ja/

ドキュメントより、atcoderフォルダをmain.cppと同じ場所に置いてコンパイルする場合、

g++ main.cpp -std=c++17 -I .

で良いですが、毎回atcoderフォルダをコピーするのは不便なので、
相対パスか絶対パスで指定することをお勧めします。

絶対パスについて、
WSLでは通常とパスが違います。(C:\~ではなく、/mnt/c/~となっているはず)
VSCodeのターミナルでac-libraryフォルダに行き、pwdすればパスがわかると思います。
以下は私の例です。

g++ main.cpp -std=c++17 -I /mnt/c/Users/rare/git/training-atcoder/ac-library

エイリアスの設定

Linuxのエイリアスって便利ですよね。
WSLでも設定できます。

VSCodeのターミナルで構わないので、.bashrcを編集しましょう。

vi ~/.bashrc

設定したいエイリアスを末尾とかに追記します。
私の場合、コンパイルコマンドはacc、実行コマンドはactに設定しています。
(atcoder compile, atcoder testの意味)
以下は私の例です。ここまで紹介したものを詰め込んでいます。

# g++ alias
alias acc='g++ $F.cpp -std=c++17 -o out.out -I /mnt/c/Users/rare/git/training-atcoder/ac-library'
alias act='./out.out < ./in.txt'

設定後は読み込み直しておきましょう。

source ~/.bashrc

オールカスタマイズ後のテスト手順

  1. C++のコードを書く
  2. F=ファイル名で変数Fに代入
  3. accでコンパイル
  4. in.txtに標準入力を書き込む
  5. actでテスト実行

Discussion

ログインするとコメントできます