並ゲームプログラマの書き捨て場

ゲームプログラマやってる私の日記、雑記、備忘録、公開場所

Clang for Windows 3.6.2を入れた

そう・・・あなたの為のClangよ・・・。djannです。


今更になるが、このブログ中で一番役に立っているともっぱらの噂のClang for Windows系の記事の最新版を記述する。なお3.6.2自体は7月16日に既にリリースされていたらしい。

と言っても、今回入れたことによって何が変わったかは、ほぼ分かっていない。リテラルを書き換えてビルドしても、変更された結果が反映されていないバグもそのままだし#define _HAS_EXCEPTIONS (0)を先に定義しなければC++の標準ライブラリをインクルード出来ない*1のもそのまま、変数の値をウォッチ出来ないのもそのままだ。

強いて大きな変化を挙げるとするならば、Visual Studio 2015が公開されているので、そちらに対応が行われたのだろうということくらいだ(前から対応されてた?)


という訳で、早速いつもの手順*2でインストールを行い、その使用感を試している。Visual Studio 2012、Visual Studio 2013に関しては、パッと見は*3本当にアップデートをしたのか?というほど何も変わっていない。今までのプロジェクトもそのまま全く同じように(バグまで)ビルド出来るし、新しく作ってからの手順も変わっていない。ひとまず以下のようにハローワールドだ。

#define _HAS_EXCEPTIONS (0)
#include <iostream>

int main()
{
	std::cout << "Hello, New LLVM world!!" << std::endl;
}

さて、では肝心のVisual Studio 2015ではどうなのかというと、現状のところどうしようもない。まずかわいいバグとして、以下のようにPlatform Toolsetでの選択肢がLLVM-vs2014となっている。おかしいな、これはVisual Studio 2015だったと思ったのだが。

f:id:djann:20150727015335p:plain


さて、早速ビルドしたところ、以下のエラーが大量に出る羽目になってしまった。

use of undeclared identifier 'char16_t'
use of undeclared identifier 'char32_t'

単純にVisual Studio上のコードハイライトを見てみるだけでも、従来char16_tやchar32_tはtypedefされていたものが、どうやら組み込みの型になったらしい。

int main()
{
	char16_t a;	// error : unknown type name 'char16_t'
}

そして上記コードの通り、Clang for Windows 3.6.2ではchar16_tは組み込みの型として存在せず、結果エラーとなるようだ。そして性質の悪いことに(当たり前だが)、これらcharXX_t型は標準ライブラリ各所で特殊化に指定されており、C++標準ライブラリを用いようとすれば、すぐさま大量のエラーを吐いてくれる。

では型定義をしたらどうか?

using char16_t = short;
using char32_t = long;
#include <iostream>

int main()	// 以下略.

shortやlongに対する特殊化を再定義したことになり、これもエラーだ。では新たな型を作ってはどうか?
これは整数値への変換と受け取りが可能な型を作成すればいける。ただし標準ライブラリの挙動が正しいままかどうか、その他もろもろの検証が必要になるだろう。とりあえずビルドを通すだけの適当な定義は以下の通りとなる。LLVM-vs2015で(いや2014だったか)最小限のHello, Worldプログラムは以下の通りだ。

struct char16_t {
	short elem;
	constexpr char16_t() : elem(0) {}
	constexpr char16_t(int val) : elem(val) {
	}
	operator int() const { return elem; }
	operator unsigned int() const { return elem; }
	operator short() const { return elem; }
	operator unsigned short() const { return elem; }
	operator long() const { return elem; }
	operator unsigned long() const { return elem; }
};
struct char32_t{
	int elem;
	constexpr char32_t() : elem(0) {}
	constexpr char32_t(int val) : elem(val) {}
	operator int() const { return elem; }
	operator unsigned int() const { return elem; }
	operator short() const { return elem; }
	operator unsigned short() const { return elem; }
	operator long() const { return elem; }
	operator unsigned long() const { return elem; }
};
#define _HAS_EXCEPTIONS (0)
#include <iostream>

int main()
{
	std::cout << "Hello, New LLVM World!!" << std::endl;

	std::cin.get();
}

というわけで、長々と書いたが現状Visual Studio 2015でLLVM-vs2014を使ってビルドするのは使い物にならない。流石にここまでして使う意味はないだろう。大丈夫だ、Visual Studio 2013があれば戦える。ドラゴンボールがあればry


回を重ねるごとに雑になってきている気がするが、今回の記事は以上となる。

*1:C言語の標準ライブラリならインクルード可ではある。全てかどうかは定かではないが

*2:インストーラを起動。旧バージョンのアンインストールを行わせ、はいはい言ってインストール完了。その後C:\Program Files (x68)\LLVM\tools\msbuild\install.batを管理者権限で起動するところまで。

*3:細かいところは知らない