はじめに
今回は windows の VScode でC言語を動かしたいと思ったので、その方法を残そうと思います。ちなみに主は超c言語初心者です。また記事初心者でもあります。そこらへんご了承ください。間違ってたこと書いてたら指摘お願いします。
結論
結論から先に行ってしまうと、wsl接続をして、実行・デバックのために launch.json と tasks.json を設定します。
1 WSL , gcc , gbd って?
検索を進めていくと、wsl だの gcc だの、用語がたくさん出てきたので、自分なりの解釈を交えて説明しようと思います。今回の記事にも出てきます。
1-1 WSL とは
wslは「Windows Subsystem for Linux」の略で windows 上で Linux を動かすための機能です。Androidエミュレータみたいなもんです。こいつを使って Linux を動かしたり、ファイルにアクセスしたりします。
1-2 gcc とは
gccはGNUプロジェクトが開発、配布している、さまざまなプログラミング言語のコンパイラ集のことです。c言語をコンパイルする時 cc example.c
みたいなのをシェルに打ったことあると思います。それです。
コンパイラとは、人間が書いたコードをコンピューターが読み込める機会語に変換する機能です。
1-3 gdb とは
GDB(GNU Debugger、または GNUデバッガ)は、GNUプロジェクトによって開発された、Unix系システムで広く利用されるデバッグ用フリーソフトウェアです。C、C++、FORTRANなどのプログラミング言語に対応し、プログラムの動作を詳細に観察し、バグを特定・修正する際に用いられます。
コンパイラ言語は、コンパイル時に順番や変数などを容量削減のため簡易的なものに置き換えられますが、gbdはデバッグ用に順番や変数情報などを保持したままコンパイルできます。
2 前提
まず、windows に WSL をインストールして Linux をインストールしてください。また、gcc と gdb もインストールしておいてください(これ結構忘れます)。つまり Linux で C がコンパイルできて実行できればいいってこと。
当然ながら VScode もインストールしておいてください。(windows版)
3 VScode で拡張機能 wsl をインストール
まずVScodeの拡張機能 WSL をインストールします。他の解説サイトでは「RIMORT WSL」と書かれている場合がありますが、WSL に名称変更されました。
すると、以下の写真のように、画面の左側にモニターのようなボタンが追加されていると思います。
4 ubuntuに接続
先ほど追加した拡張機能 WSL のモニターのようなボタンをおすと、ubuntu(バージョン名※ない場合もある) が選択できると思います。ubuntuを選択して接続して下さい。
すると、ウィンドウ右下に「WSL: Ubuntu(バージョン名※ない場合もある)」と表示されると思います。
5 C言語用拡張機能のインストール
次にc言語用の拡張機能を入れていきます。実行にはこれは必須です。
:::note warn
※かならずubuntuに接続してインストールしてください!
:::
・C/C++ Extension Pack
必要な拡張機能がまとめてインストールできます。ほかはインストールしなくて大丈夫です。便利だ。
個別に必要なものだけインストールしても大丈夫です。
6 テスト用ファイル作成
いよいよ実行・デバッグのためのコードを書いていきます。書くと言ってもほぼコピペでOKです!
まずは作業用のディレクトリを作ってください。今回は c_test でいきます。
VScodeはシェルをVScode上で実行できます。「ctrl + j」でターミナルを開けます。また、シェルを利用しなくてもVScodeはファイル操作をGUIで直感的に操作できます。そこで作っても大丈夫です。
cd ~
mkdir c_test
cd ~/c_test
つぎに、c言語のコードを適当に書きます。せっかくなので、VScode上で作業してみましょう。
まず左上のエクスプローラーを開きます。
次にエクスプローラーの「フォルダーを開く」を押したあと、先程作成した「c_test」を開き「OK」を押します。
新しいウィンドウが開き、「test_c」が開きます。次に hello_world.cを作成します。
まず、エクスプローラーのどこかを右クリックして「新しいファイル」を選択します。
そして名前を「hello_world.c」にしてください。拡張子(.c)もいります。そして以下のコードを貼り付けてください。
※VScodeは自動保存がデフォルトでONになっているので、上書き保存をする必要はありません。心配なら毎度「cntl+s」で保存するといいでしょう。
/*テスト用コード
意図しておかしくしてます*/
#include <stdio.h>
int main(void){
printf("hello,world!\n");
for (int i=0; i>3; i++){
printf("hello,world! %d\n", i);
}
return 0;
}
home
└ c_test
└ hello_world.c
7 launch.json 作成
しかし、このままでは実行・デバックはできません。コンパイラ起動用のファイルを書いていきます。
まず、左の実行とデバッグのタブをおして「launch.json ファイルを作成します」をクリックしてください。
そして開いたlaunch.jsonファイルに以下のコードを貼り付けてください。
※もともと書いてあるコードは全部消して、すべて書き直してください。
{
"version": "0.2.0",
"configurations": [
{
"name": "C/C++: gcc アクティブなファイルのビルド", // デバッグ設定の名前
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/build/${fileBasenameNoExtension}.out", //tasks.json と同じ出力パスを指定
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}", // ここも作業ディレクトリに合わせる
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
// ここはtasks.jsonで設定したラベルと一致させる
"preLaunchTask": "C/C++: gcc アクティブなファイルのビルド"
}
]
}
次にtasks.json
を作成します。「ctrl+shift+b」をおして「実行するビルドタスクがありません。ビルドタスクを構成する...」、「テンプレートから tasks.json を作成」、「others」を押します。そして以下のコードを貼り付けてください。
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"detail": "デバッガーによって生成されたタスク。",
"label": "C/C++: gcc アクティブなファイルのビルド",
"command": "/usr/bin/gcc",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}/build/${fileBasenameNoExtension}.out",
"-lm"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
これで設定は終わりです。実行してデバックしていきましょう。
8 実行とデバッグ
実行は右上の三角マークを押すか、F5キーでできます。いろいろ下に出てきたあと、ターミナルを開くことで結果を見ることができます。早速実行してみましょう。
※ここから茶番はいります。デバッグについて知っている方は飛ばしてもらって構いません。
ん?「hello world」と 1+3 で4かい表示してほしいのに、1回しかでてきてません。
そんなときはデバッグをしてみましょう!
実行をストップしてほしい行の行番号の左に赤い点(ブレークポイント)を設定します。
そしてF5をおしてデバッグをスタートします。すると黄色いマーカーがひかれて、プログラムがストップします。
ここで画像左上をみるとなにか矢印がついたボタンが複数現れます。これをつかってコードを動かして行きます。
8-1 デバッグ時のボタンの説明
①続行 (Continue)
・アイコン: 再生ボタン(▶︎)のようなマーク。
・キーボードショートカット: F5
・役割: 次のブレークポイントに到達するか、プログラムが終了するまで、デバッグセッションを中断せずに実行を続けます。もしブレークポイントが設定されていない場合は、プログラムの最後まで一気に実行されます。
②ステップオーバー (Step Over)
・アイコン: 曲線矢印が点の上を通っているようなマーク
・キーボードショートカット: F10
・役割: 現在の行を実行し、次の行に進みます。もし現在の行に関数呼び出しが含まれていても、その関数の内部には入りません(関数全体を実行して次の行に進みます)。主に、関数の内部動作に興味がない場合に便利です。
③ステップイン (Step Into)
・アイコン: 下向きの矢印が点の中に入っていくようなマーク
・キーボードショートカット: F11
・役割: 現在の行を実行し、次の行に進みます。もし現在の行に関数呼び出しが含まれている場合は、その関数の内部に入り込み、関数内の最初の行で停止します。関数の内部動作を詳しく追跡したい場合に便利です。
④ステップアウト (Step Out)
・アイコン: 上向きの矢印が点から出ていくようなマーク
・キーボードショートカット: Shift + F11
・役割: 現在実行中の関数からリターンするまで実行を続け、その関数を呼び出した元の関数の次の行で停止します。関数の内部に入りすぎてしまったが、残りの部分の内部動作には興味がなく、呼び出し元に戻りたい場合に便利です。
⑤再起動 (Restart)
・アイコン: 円形の矢印
・キーボードショートカット: Ctrl + Shift + F5 (Windows/Linux) / Cmd + Shift + F5 (macOS)
・役割: 現在のデバッグセッションを終了し、プログラムを最初から再起動します。プログラムの状態をリセットして最初からデバッグし直したい場合に便利です。
⑥停止 (Stop)
・アイコン: 四角いマーク。
・キーボードショートカット: Shift + F5
・役割: 現在のデバッグセッションを完全に終了します。プログラムの実行も停止します。
基本的にはステップオーバーを連打でOKです。一気に進めたい場合は続行を押します。
ーーーーーーーーーーーーーーーーーーーーーーーーー
※茶番にもどります。
一つずつ実行しているとforのなかに入っていませんね。おっと!forの続行条件の不等号の向きが逆になっていますね!これを修正すると、、、
しっかり指定した回数分printfが実行されました!
9 まとめ
今回はVScodeでC言語を動かして行きました。ファイル操作も直感的にできて満足しています。ぜひC言語勉強の助けになればいいなと思います。ご高覧ありがとうございました。
10 余談(まじで関係ないです)
ubuntu をwindowsで実行するとき、Hyper-vがオンになってないと行けないじゃないですか。でもAndroidエミュレーターってHyper-vオンだと性能が下がるじゃないですか。なにかいい方法知っている人いたら教えて下さい。