読者です 読者をやめる 読者になる 読者になる

clang 3.1をWindowsで使ってみた

次期C++BuilderのC++コンパイラがLLVM/clangになる*1というので、早速いじってみた。

まずはインストール。現時点でWindows上でclangを動かすにはmingwが必要とのことで、まずはmingwのインストール。

  1. http://sourceforge.net/projects/mingw/files/Installer/mingw-get/catalogue/からDownload mingw-get-inst-20120426.exeをクリック。
  2. ダウンロードしたインストーラーを実行してmingwをインストール。

続いて、LLVMのインストール。LLVMのダウンロードページからWindows用のバイナリをダウンロード。
ダウンロードしたアーカイブを解凍して、mingwのインストール先に上書き。
以上で、Windows上でclangがインストールされる。

コンパイルは以下の感じ。ネタはC++11でサポートされたラムダ式を使ってFizzBuzz問題を解いてみる。

#include <tchar.h>
#include <stdlib.h>
#include <algorithm>
#include <iostream>
#include <vector>
#include <iterator>

class CFizzBazz {

private:
  class Incl {
  public:
    Incl() : m_cnt(1) {
    }
    int operator() () {
      return m_cnt++;
    }
  private:
    int m_cnt;
  };

public:
  CFizzBazz(int max) {
    std::vector<int> v;
    std::generate_n(std::back_inserter(v), max, Incl());
    std::for_each(v.begin(), v.end(), [](int num) {
      if (num % 3 == 0 && num % 5 == 0) {
        std::cout << "FizzBazz";
      } else if (num % 3 == 0) {
        std::cout << "Fizz";
      } else if (num % 5 == 0) {
        std::cout << "Bazz";
      } else {
        std::cout << num;
      }
      std::cout << std::endl;
    });
  }
};

int _tmain(int argc, _TCHAR* argv[])
{
  CFizzBazz fizzBazz(_ttoi(argv[1]));
  return 0;
}

スタートメニューから[MinGW|MinGW Shell]を選択してコマンドラインシェルを起動。
コマンドラインから以下を入力。

$ clang -std=c++11 fizzbuzz.cpp -o fizzbuzz.exe -lstdc++

clangの最大の特徴として、エラーメッセージが非常に見やすいってのがある。C++の欠点としてテンプレートとか使うとエラーメッセージがわけわかめになるのがあるけど、それが解消されている。C++11の準拠度もかなり高い感じだし、古いコンパイラを捨てて、clangに移行するのはいい決断ではないかと。

*1:もしかして、DelphiのバックエンドもLLVMになるとか?