C言語、C++をVSCodeの拡張機能Code Runnerでワンクリックでコンパイルして実行する方法

# 環境構築
今回はVisual Studio Codeの拡張機能であるCode Runnerを用いてワンクリック、ワンショートカットでコンパイルと実行を行い、快適にC言語/C++を実行できる環境を構築していきたいと思います。
- Visual Studioだと高機能すぎて使いこなせない
- シンプルなVSCodeで記述してボタンひとつで実行したい
という方の参考になればと思います。
- プログラミング初心者向けです。
:::note warn
注意事項
当方はプログラミング、ITに疎い**初心者**であるためネットで調べて環境構築ができたよという内容をまとめた記事になります。
もし間違っていたり、補足が必要な場合はぜひ編集リクエストやコメントを頂ければと思います。
:::

**VSCode**はVisual Studio Codeはマイクロソフトが提供するシンプルなエディターです。拡張機能が簡単にインストールできるので自分好みにカスタマイズすることもできるらしいです。
※僕は使いこなせていません。

メモ帳は間違っているところを教えてくれたり、自動で字下げしてくれたりはしませんのでエディターがあったほうがやりやすいかと思います。

他にもSublime Text、Visual Studio 2022、Vimなどがあるようです。

**Visual Studio**はコンパイラを単独でインストールしなくてもC言語/C++を実行できるIDE(統合開発環境)ですが高機能すぎて僕は扱えておりません。こいついきなりソリューションとかプロジェクトとかコンソールアプリとか選ばせてくるので慣れるまでは敷居が高い(誤用)テキストエディタ―かなと思います。

VSCodeの方は直観的な操作だけで最低限扱えると思います。

なにはともあれここではVSCodeをインストールしてください。

VSCodeのインストールに関しては省略します。
インストールに関しては[こちら](http://imgprolab.sys.fit.ac.jp/~yama/CProI/lec/VScode_CodeRunner_Install.pdf)を参照してください。
検索すれば出てくると思いますが[VSCode](https://azure.microsoft.com/ja-jp/products/visual-studio-code)からダウンロードできます。

## MinGWのインストール
>MinGW は簡単に言うと， Windows で使える GCC（コマンドラインから使える gcc, g++, gfortran などのGNU コンパイラコレクション）です。
引用元:https://home.hirosaki-u.ac.jp/heroic-2020/windows/mingw/

詳しいことはわかりませんが、MinGWというのはWindowsに移植されたgcc、g++コマンドを使うためのツールなんですかね？

**Code RunnerはVSCode上でワンクリックでコンパイルと実行を行えるようにするために使います。**

MinGWがあればVSCode、Code-RunnerがなくてもWindows標準のコマンドプロンプトなどのソフトウェアでC言語、C++をコンパイル、実行できます。
それに関しては[前回の記事](https://qiita.com/yo_asobi/items/e3aa4ec88008ffd31aec)で環境構築しているのでそちらをご覧ください。

:::note warn
注意事項
前回の競技プログラミングを始める記事でインストールしたMinGWは32bit環境向けのものらしく今回の記事でインストールするMinGW-w64は64bit環境向けのもののようです。
:::
※どちらも僕のWindows10 64bit環境では動作しております。

それではMinGW-w64をインストールしていきたいと思います。

MinGW-w64のインストールに関しては[MinGW-w64のダウンロードとインストール](https://www.javadrive.jp/cstart/install/index6.html)を参照しました。

- まず、[このサイト](https://github.com/niXman/mingw-builds-binaries/releases)の`Release 12.2.0-rt_v10-rev0`を探してください。

- 次に`x86_64-12.2.0-release-win32-seh-rt_v10-rev0.7z`をダウンロードしてください。
※Assetsが開いていなければクリックして開いてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582228/d337e46a-5ac2-76a4-f022-ac086115e077.png)

.7zが解凍できない場合は7-zipという解凍ソフトをインストールしてください。

https://7-zip.opensource.jp/

- ダウンロードできたら中身をCドライブ直下などに配置します。エクスプローラー、つまり標準ファイルソフトを開いてローカルディスク(C:)を開いた場所に解凍します。
※必ずしもCドライブ直下でなくてもよいと思います。

- 解凍して配置できたらWin+Iキーなどで設定を開きます。環境変数と検索して環境変数を編集>>Path>>新規>>`C:\mingw64\bin`と入力してOKを押して閉じます。

`C:\mingw64\bin`はmingw64フォルダの中のbinフォルダの位置を表すアドレスです。Cドライブ直下以外に配置した場合はそのアドレスを入力してください。
エクスプローラーなどの上の部分を右クリックするとアドレスをコピーできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582228/616f8cdf-7270-118a-251d-ed403ccd7844.png)

僕はユーザー環境変数にpathを通していますが、システム環境変数でも参照したサイトを見る限りでは問題ないようです。

これを見る限りではユーザー環境変数はログインしているユーザーに対応するものでシステム環境変数はどのユーザーでもそのコンピューターを使っている限り使えるものということでしょうか。

https://wa3.i-3-i.info/diff403hensu.html

※MinGWは2つもいらないので他にもMinGWをインストールしている人は片方のpathを削除しておくとよいと思います。

- これでコマンドプロンプトなどを開いてgcc -vと入力すればバージョンが表示されると思います。

- あとはCode Runnnerの設定を行っていきます。

**コマンドプロンプトはWindows+Rキー>>cmdと入力してEnterを押せば開けます。**

## Code Runnerのインストールと設定

- VSCodeを起動したら左のツールバーにある拡張機能を開いてCode Runnerと検索しインストールします。
C/C++という拡張機能が必要だったかどうかわかりませんが、とりあえずインストールしておくと良いと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582228/f8e06a2a-604c-07c5-a5fb-3028cd9e591f.png)
次に歯車の設定を押して拡張機能の設定を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582228/d2f57547-1d56-9333-c1a3-0805fdf415a1.png)
- Run In Terminalにチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582228/cfdf05d7-2b80-4b88-2bc4-643bd2242189.png)
チェックを入れておかないとscanf関数などの入力を行うことができなくなるようです。
- Executor Mapのsettings.jsonで編集をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582228/a8da6064-3b35-f1d4-af59-89b88ad9af1f.png)
settings.jsonを開いたらsettings.jsonのバックアップをとっておくとよいと思います。コードの中身をわけもわからずいじるのでバックアップしておくことを推奨します。

デフォルトのソースコードを貼っておきます。
※一度も実行したことがないとこのソースが書かれていないかもしれません。
<details><summary>Code-runner settings.json</summary>

```json:settings.json
{
    "code-runner.executorMap": {
        "javascript": "node",
        "java": "cd $dir && javac $fileName && java $fileNameWithoutExt",
        "c": "cd $dir && gcc $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
        "cpp": "cd $dir && g++ $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
        "objective-c": "cd $dir && gcc -framework Cocoa $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
        "php": "php",
        "python": "python -u",
        "perl": "perl",
        "perl6": "perl6",
        "ruby": "ruby",
        "go": "go run",
        "lua": "lua",
        "groovy": "groovy",
        "powershell": "powershell -ExecutionPolicy ByPass -File",
        "bat": "cmd /c",
        "shellscript": "bash",
        "fsharp": "fsi",
        "csharp": "scriptcs",
        "vbscript": "cscript //Nologo",
        "typescript": "ts-node",
        "coffeescript": "coffee",
        "scala": "scala",
        "swift": "swift",
        "julia": "julia",
        "crystal": "crystal",
        "ocaml": "ocaml",
        "r": "Rscript",
        "applescript": "osascript",
        "clojure": "lein exec",
        "haxe": "haxe --cwd $dirWithoutTrailingSlash --run $fileNameWithoutExt",
        "rust": "cd $dir && rustc $fileName && $dir$fileNameWithoutExt",
        "racket": "racket",
        "scheme": "csi -script",
        "ahk": "autohotkey",
        "autoit": "autoit3",
        "dart": "dart",
        "pascal": "cd $dir && fpc $fileName && $dir$fileNameWithoutExt",
        "d": "cd $dir && dmd $fileName && $dir$fileNameWithoutExt",
        "haskell": "runhaskell",
        "nim": "nim compile --verbosity:0 --hints:off --run",
        "lisp": "sbcl --script",
        "kit": "kitc --run",
        "v": "v run",
        "sass": "sass --style expanded",
        "scss": "scss --style expanded",
        "less": "cd $dir && lessc $fileName $fileNameWithoutExt.css",
        "FortranFreeForm": "cd $dir && gfortran $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
        "fortran-modern": "cd $dir && gfortran $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
        "fortran_fixed-form": "cd $dir && gfortran $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
        "fortran": "cd $dir && gfortran $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt"
    },
}
```

</details>

```json:変更前
"c": "cd $dir && gcc $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
"cpp": "cd $dir && g++ $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
```
"c"、"cpp"と書かれている部分を以下のように変更します。
変更したらCtrl+Sなどで上書き保存してください。
```json:変更後
"c": "cd $dir && gcc --exec-charset=cp932 $fileName -o $fileNameWithoutExt && chcp 932 | Out-Null && $dir$fileNameWithoutExt",
"cpp": "cd $dir && g++ --exec-charset=cp932 $fileName -o $fileNameWithoutExt && chcp 932 | Out-Null && $dir$fileNameWithoutExt",
```
コマンドプロンプトで`chcp 65001`と入力すると文字コードがutf-8に変更されるように、今回は932なのでshift-jisコードを設定しているのだと思われます。

**補足ですがVSCodeはデフォルトのエンコードがUTF-8になっているためターミナルで日本語の文章を出力すると文字化けします。**
※あくまでC言語、mingw環境の話です。

Code Runnerを使わずにVSCodeのターミナル、コマンドプロンプトなどでCを実行する場合はデフォルトのエンコードをshift-jisに変更するかターミナルに`chcp 65001`と入力してから実行すれば文字化けせずに日本語を入力できると思います。

**初心者の教訓として日本語をどっかから持ってきてコピペすると文字コードの違いで文字化けすることがあります。**

:::note warn
注意事項
当方はプログラミング、ITに疎い**初心者**であるためネットで調べた知識にすぎません。間違いや誤解をまねくような表現があればご教授いただければ幸いです。
:::

Code Runnerの設定が終われば後は簡単です。

# いざ実行

- 以下のような適当なソースコードをコピペするかつくって拡張子`.c`もしくは`.cpp`のファイルをつくります。
```c
#include <stdio.h>
int main(void){
    printf("こんにちは\n");
    return 0;
}
```
- VSCodeで開きます
- VSCodeの右上にある三角を押せば**ワンクリックでコンパイルから実行までを自動で行ってくれます。**
※Code Runnerで実行できていないときがあるので写真右上の赤い丸のところからRun Codeを選んでください。一度選べば今後は選ばなくてよいはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582228/8383e7c4-0fae-90c7-933b-a64d71b0d8e8.png)

実行できればVSCodeの下に「こんにちは」が表示されると思います。

```
PS C:> cd "c:" ; if ($?) { gcc --exec-charset=cp932 test.c -o test } ; if ($?) { chcp 932 | Out-Null } ; if ($?) { .\test }
こんにちは
```

できた！！

Code-Runnerは`Ctrl+Alt+N`というショートカットキーひとつで実行することもできます。

ソースを変更して上書き保存し、実行するとターミナルに直接数値を入力できます。

```c
#include <stdio.h>
int main(void){
    int a;
    printf("こんにちは,整数を入力してください。\n");
    scanf("%d",&a);
    if (a <= 100 && a >= 0) printf("入力された数値は0以上100以下です。\n");
    else printf("入力された数値は範囲外です。");
    return 0;
}
```
```
こんにちは,整数を入力してください。
0
入力された数値は0以上100以下です。
```
```
こんにちは,整数を入力してください。
203
入力された数値は範囲外です。
```
このように出力されると思います。

※コードを書き換えた時は上書き保存してから実行してください。

最後まで読んでいただきありがとうございました。
いいね、コメント等いただけると幸いです。