これはなに
C++のヘッダファイル.hpp
を作成する際に、毎回手動でインクルードガードを書くのが面倒になった。そこで。Visual Studio Code (VS Code)のスニペット機能を使って、C++のインクルードガードを自動生成するようにした。そのスニペットを紹介する。
スニペットの登録
VS Codeで、ファイル > 基本設定 > ユーザースニペットを選択し、C++のユーザースニペットの登録用JSONファイルを開く1。任意の箇所に以下のコードをコピー&ペーストし、ファイルを保存する。
{
// ...
// ほかの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
を実行すると、下記コードが自動で生成される。
#ifndef TEST_HEADER_FILE_HPP_
#define TEST_HEADER_FILE_HPP_
// (ここにカーソルがくる)
#endif // TEST_HEADER_FILE_HPP_
なお、命名規則はGoogle C++ Style Guide に則っている。
スニペットの解説
つくったはいいものの暗号みたいなスニペットになってしまったため、何をしているかも書いておく。 下記の1文が理解できれば問題ないだろう。
"${TM_FILENAME/([\\-\\\\\\.])|(\\w+)/${1:+_}${2:/upcase}/g}_"
この部分でしていることは、ファイル名のうち-
, \
, .
をアンダーバーに変換し、
かつ、それ以外のアルファベットを大文字(Upper Case)に変換している。
形式としては、${変換対象/正規表現/変換指定}
という形をとっている。
変換対象であるTM_FILENAME
は、VS Codeのスニペットで使える変数であり、ファイル名を表す。
詳細は公式サイト
を参照してほしい。
たとえば、TM_FILENAME
をRELATIVE_FILEPATH
にすると、相対パスも含めたファイル名になる。
正規表現の部分では、-
, \
, .
に一致する記号を$1
に、それ以外の半角英数字を$2
に抽出している。
VS Codeのスニペットでは、or (|
)で区切られた正規表現は、それぞれ別の変数に入力されるらしい。
最後に、変換指定の部分で、$1
に抽出された記号をすべて_
に変換し、$2
に抽出された半角英数字をすべて大文字に変換している。
ちなみに
正直C++ Helper などの拡張機能を入れればすむ話ではある。