VSCode C++環境設定(Windows Mingw-w64)

#概要
Visual Studio Codeで、C++ビルド・デバッグ環境を整備してみました。
まずはWindows 10でMingw-w64(8.1.0)の環境を作ってみましょう。

|#|環境|バージョン|備考|
|-|-|-|--|
|1|Windows 10 Pro|20H2||
|2|Visual Studio Code|1.55.2|+ C/C++ for Visual Studio Code|
|3|Mingw-w64|8.1.0|http://mingw-w64.org/|

# 設定ファイル一覧
設定ファイルは、ワークスペースの直下にある`.vscode`フォルダにあります。

### ~/.vscode/launch.json
デバッガー(gdb.exe)へのパスを`"miDebuggerPath"`に指定します。

```json:launch.json
{
    "version": "0.2.0",
    "configurations": [
    {
        "name": "g++.exe - アクティブ ファイルのビルドとデバッグ",
        "type": "cppdbg",
        "request": "launch",
        "program": "${fileDirname}/${fileBasenameNoExtension}.exe",
        "args": [],
        "stopAtEntry": false,
        "cwd": "${workspaceFolder}",
        "environment": [],
        "externalConsole": false,
        "MIMode": "gdb",
        "miDebuggerPath": "C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/bin/gdb.exe",
        "setupCommands": [
            {
                "description": "gdb の再フォーマットを有効にする",
                "text": "-enable-pretty-printing",
                "ignoreFailures": true
            }
        ],
        "preLaunchTask": "[Windows] C/C++: g++.exe アクティブなファイルのビルド"
    }
    ]
}
```

### ~/.vscode/tasks.json
大きなスタックサイズを確保して、ビルドされたロードモジュールを起動すると、SIGSEGV(セグメンテーション障害)でダウンしてしまうので、スタックサイズを大きく取ります（デフォルトは8メガバイトのようです）。
g++には、`-Wl,--stack,<size>`の指定をするのですが、以下のように二つのパラメーターに分けて指定をしないといけないようです。
なお、この設定では、64メガバイトのスタック領域を確保しています。
ちなみに、Linux g++でサポートされている`-fsplit-stack`は、Windowsではサポートされておらず、g++.exeがエラーになってしまいました。

```json:tasks.json
{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "[Windows] C/C++: g++.exe アクティブなファイルのビルド",
            "command": "C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/bin/g++.exe",
            "args": [
                "-Wl,--stack",
                "-Wl,67108864",
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}.exe"
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "デバッガーによって生成されたタスク。"
        }
    ],
    "version": "2.0.0"
}
```

### ~/.vscode/c_cpp_properties.json
このくらい`includePath`を指定しておけばよいでしょうか？（かなりパスが深いです）
全ヘッダ取り込みの、`#include <bits/stdc++.h>`の指定も使えるようになります。


```json:c_cpp_properties.json
{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++",
                "C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/x86_64-w64-mingw32",
                "C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include-fixed",
                "C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/include",
                "C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/x86_64-w64-mingw32/include",
                "C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/opt/include",
                "${workspaceFolder}/**"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "windowsSdkVersion": "10.0.19041.0",
            "compilerPath": "C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/bin/g++.exe",
            "cStandard": "c17",
            "cppStandard": "c++17",
            "intelliSenseMode": "windows-gcc-x64",
            "browse": {
                "path": [
                    "C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++",
                    "C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/x86_64-w64-mingw32",
                    "C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include-fixed",
                    "C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/include",
                    "C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/x86_64-w64-mingw32/include",
                    "C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/opt/include",
                    "${workspaceFolder}/**"
                ],
                "limitSymbolsToIncludedHeaders": true,
                "databaseFilename": ""
            }
        }
    ],
    "version": 4
}
```

# 今後
Linux, Mac環境でも共通ファイルにできるように調整を続けます。