GCCで日本語識別子を使う

GCCで日本語識別子を使う方法について、日本語の情報はあまり見かけませんので書き留めておきます。

バージョン4.1.xから-fextended-identifiersというコンパイルオプションが追加されています。現時点では実験的なもののようですが、特に問題なく動作しています。この-fextended-identifiersというのは、日本語の識別子を直接使えるようにするオプションではありません。できることは、国際文字名を有効にすることだけです。

国際文字名というのは、\uXXXXまたは\UXXXXXXXX(Xの部分は16進数字)の形式でUTF-16またはUTF-32の値を直接指定する書式です。変数名や関数名などの識別子に対しても、この国際文字名が使えるようになったというわけです。

以前から、gcd(GNU版のDコンパイラ)を使った場合には、UTF-8で日本語の識別子を書いた場合、アセンブリ言語のソース上でもUTF-8がそのまま埋め込まれていましたから、少なくともアセンブラやリンカは対応していることはわかっていました。しかし、gccやg++が対応していなかったのでどうしようもなかったのです。

もっとも、国際文字名を直接記述するのは大変ですし、可読性に関しては論外です。ですので、実際に編集するソースファイルには、普通に日本語で記述しておき、コンパイルする前に前処理を行って国際文字名に変換するのが妥当でしょう。

/* mb2ucn.c */
#include <stdio.h>
#include <locale.h>
#include <wchar.h>
 
int main(void)
{
  wint_t wc;
 
  setlocale(LC_CTYPE, "");
 
  while ((wc = getwchar()) != WEOF)
  {
    if (wc < 0x80)
      putwchar(wc);
    else
      wprintf(L"\\u%04x", wc);
  }
}

たとえば、上記のような前処理プログラムを作っておけば、コマンドライン上で(あるいはMakefileで)コンパイルする場合にはごく簡単に日本語識別子が使えるようになります。

mb2ucn < ソースファイル名 | g++ -fextended-identifiers -x c++ -

GCCの日本語識別子に関しては問題点がないわけではありません。最も重要な問題点は、GDBで使えないことです。たとえば、pコマンドで変数の値を見ようとしても、日本語名をそのまま指定することはできませんし、国際文字名でも指定できません(MinGWでしか確認していませんので、他の環境ならできるかもしれません)。

なかなか完璧とまではいきませんが、上手く活用すれば日本語識別子はそれなりに便利ですので、今後ももう少し調査を進めたいと思います。

この記事のトラックバックURL:

http://www.kijineko.co.jp/trackback/914