待望の、と言うべきか。
Visual Studio Communityに続いて、Delphi / C++Builderの個人向け無償エディション(Professional相当)がリリースされた。
www.embarcadero.com年間売上が約50万を超える企業では利用できないから、実質個人向けだろう。
実は今、業務でこの開発環境(C++Builder Professional Edition)を利用している。
VBやWinFormsライクなRADや、Clangベースで64-bit開発ができるのはVSでMFCで開発するのと比べるとコストが低く悪くはないが、クオリティの面ではVSやEclipse等と比べて数段低い。
相変わらずバグが多くビルドが上手くいかない時があり、作り方が悪いのかそもそもバグなのか悩む事になる。
Professional Editionではテクニカルサポートがあるのでまあ助かるが、そうでなければそれなりに苦しむ場面が出てくるのは、想像に難くない。
特にRTLやリンカ周りの挙動が怪しい。
32-bitでカスタム コンポーネント(パッケージ)は作成できるが、ClangベースでコンパイルしたパッケージがBCC32でビルドするアプリケーションにリンクできなかったりする。
海外の口コミ等を見ると、どうも、パッケージのコンパイルにはClangベースは使えないとの情報があるが、公式の詳しい説明も(どこかにあるのかも知れないが)見つからず、不明瞭だ。
又、クラス エクスプローラが何故か64-bitでは使えなかったり、クラスメンバをウィザードで作成すると宣言(.h)は下から順に、定義(.cpp)は上から順に記述されるという訳のわからない動きをして、結局、手で書き直した方がマシに思えたりもする。デストラクタもウィザードからは作れない。
リファクタリング支援もDelphiではある程度できるらしいが、C++では名前変更しかできず貧弱で、それですらまともに動かなかったりする。
プリプロセッサにより実行されないコードも見ただけではわからない。VSだとグレーアウトしたりして、とてもわかりやすいのだけれども。
コード補完や定義の検索の動作も非常におぼつかない。
又、特に窮屈に感じるのが、VCLで扱う文字列がUnicode(wchar_t)固定であるところだ。
TCHARマクロを使うことはできるが、マッピングの如何に関わらず、VCLの文字列はUnicodeString。
UnicodeStringのc_str/w_str/t_str関数はどれを使ってもwchar_t型のポインタで、AnsiStringはどれを使ってもchar型のポインタになる。つまり、マルチバイト文字列とUnicode文字列の相互運用をする場合
String text = L"Hello"; // UnicodeString
TCHAR* caption = _T("Title");
MessageBox(nullptr, text.t_str(), caption, MB_OK);
上記のようなコードではだめで、下記のように書かなければならない。
String text = L"Hello"; // UnicodeString
TCHAR* caption = _T("Title");
MessageBoxW(nullptr, text.w_str(), UnicodeString(caption).w_str(), MB_OK);
又は
TCHAR* messageText;
#if defined(_UNICODE)
messageText = text.w_str();
#else
messageText = AnsiString(text).c_str();
#endif
MessageBox(nullptr, messageText, caption, MB_OK);
UnicodeStringとAnsiString間はコピーコンストラクタやコンストラクタ引数、演算子のオーバロード等により容易に相互変換できるのが救いか。今更マルチバイト文字列なんて使わないよ、と言うのであればどうでもいいかもしれない。
生産性の面では悪くないし、GetIt(VSのNuGetみたいなもの)も良さげなパッケージがリリースされているので、個人的にはDelphiよりもC++は開発環境としては見過ごせない存在ではある。
Borlandと.NET / C#の経緯を考えると不思議ではないが、VCLのクラスは.NETによく似ているので、WTLやMFCよりは使いやすい(良いコードが書けるかどうかは別として)。
だが、Windows ネイティブ開発のための環境として考えると、前述のようなクオリティの低さがVSやQt等に対して見劣りしてしまう。日本語コミュニティがあまり活発でないのも残念なところだ。