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だったと思ったのだが。
さて、早速ビルドしたところ、以下のエラーが大量に出る羽目になってしまった。
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
回を重ねるごとに雑になってきている気がするが、今回の記事は以上となる。