Featured image of post VS CodeのスニペットでC++のインクルードガードを自動生成する

VS CodeのスニペットでC++のインクルードガードを自動生成する

これはなに Link to this heading

C++のヘッダファイル.hppを作成する際に、毎回手動でインクルードガードを書くのが面倒になった。そこで。Visual Studio Code (VS Code)のスニペット機能を使って、C++のインクルードガードを自動生成するようにした。そのスニペットを紹介する。

スニペットの登録 Link to this heading

VS Codeで、ファイル > 基本設定 > ユーザースニペットを選択し、C++のユーザースニペットの登録用JSONファイルを開く1。任意の箇所に以下のコードをコピー&ペーストし、ファイルを保存する。

cpp.json
{
    // ...
    // ほかのSnippets
    // ...
    "Include guard": {
        "prefix": "guard",
        "body": [
            "#ifndef ${TM_FILENAME/([\\-\\\\\\.])|(\\w+)/${1:+_}${2:/upcase}/g}_",
            "#define ${TM_FILENAME/([\\-\\\\\\.])|(\\w+)/${1:+_}${2:/upcase}/g}_",
            "",
            "$0",
            "",
            "#endif // ${TM_FILENAME/([\\-\\\\\\.])|(\\w+)/${1:+_}${2:/upcase}/g}_",
        ],
    }
}

たとえば、“test_header_file.hpp"ファイルでこのスニペットguardを実行すると、下記コードが自動で生成される。

test_header_file.hpp
#ifndef TEST_HEADER_FILE_HPP_
#define TEST_HEADER_FILE_HPP_

// (ここにカーソルがくる)

#endif // TEST_HEADER_FILE_HPP_

なお、命名規則はGoogle C++ Style Guide に則っている。

スニペットの解説 Link to this heading

つくったはいいものの暗号みたいなスニペットになってしまったため、何をしているかも書いておく。 下記の1文が理解できれば問題ないだろう。

"${TM_FILENAME/([\\-\\\\\\.])|(\\w+)/${1:+_}${2:/upcase}/g}_"

この部分でしていることは、ファイル名のうち-, \, .をアンダーバーに変換し、 かつ、それ以外のアルファベットを大文字(Upper Case)に変換している。

形式としては、${変換対象/正規表現/変換指定}という形をとっている。

変換対象であるTM_FILENAMEは、VS Codeのスニペットで使える変数であり、ファイル名を表す。 詳細は公式サイト を参照してほしい。 たとえば、TM_FILENAMERELATIVE_FILEPATHにすると、相対パスも含めたファイル名になる。

正規表現の部分では、-, \, .に一致する記号を$1に、それ以外の半角英数字を$2に抽出している。 VS Codeのスニペットでは、or (|)で区切られた正規表現は、それぞれ別の変数に入力されるらしい。

最後に、変換指定の部分で、$1に抽出された記号をすべて_に変換し、$2に抽出された半角英数字をすべて大文字に変換している。

ちなみに Link to this heading

正直C++ Helper などの拡張機能を入れればすむ話ではある。

参考文献・URL Link to this heading


  1. VS Codeにおけるスニペットの登録の仕方は公式サイト を参照のこと。 ↩︎

Licensed under CC BY-NC-SA 4.0
最終更新 5月 21, 2023
Hugo で構築されています。
テーマ StackJimmy によって設計されています。