これは,VisualStudio AdventCalenderの5日目の記事です.
VisualStudio の AdventCalender に空きがあって,丁度誰もVisualStudio 2017 RCのClangについて書いていなかったので,参加してみました.下手な文章ですが,読んでいただけると幸いです.
#include <Windows.h>
をするとコケるという VisualStudio 2015 時代ではあんまりよくなかった Clang with Microsoft CodeGen でしたが,VisualStudio 2017 で #include <Windows.h>
をしてもこけなくなりました
この記事では,VisualStudio 2017 RC上で Clang を用いてコンパイルする方法を書きます.また,それでは内容スカスカな記事になるので,初心者がずっこけそうな日本語関係をすこーしまとめます.(C++であまり文字列を扱うプログラムを書かないので,間違いがあれば指摘していただけるとありがたいです.)
注意事項
2016/12現在(VisualStudio 2017 RC)の内容ですので,気を付けてください
インストール
VisualStudio Installer を起動して インストール済み VS の 変更 ボタンを押します.
個別のコンポーネントタブを開き, Clang with Microsoft CodeGen を選択,右下の 変更 ボタンを押して,数分程度昼寝してれば,インストールは終了です.
ソリューションの準備
とりあえず,コンソールアプリケーションを作りたいので,普通に Visual C++ → Win32 → Win32 コンソールアプリケーションとたどってソリューションを作ります.
そして,上の画像のように,「プラットフォーム ツールセット」を VisualStudio 2017 - Clang with Microsoft CodeGen なんちゃら にしてやればおkです.
日本語は大丈夫なのか?
ちゃんと書けば,大丈夫です.
#include <iostream>
#include <string>
int main()
{
std::string str = "お前は誰だ?";
std::cout << str << "\n";
std::wstring wstr = L"お前は誰だ?";
std::wcout << wstr << L"\n";
return 0;
}
???「ここに Shift JIS で保存した,クソコードがあるじゃろ?」
MSVC, Clang「はい」
???「これをおぬしらにコンパイルさせると…」
MSVC「
1>------ ビルド開始: プロジェクト:ClangTest, 構成:Debug Win32 ------
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========
」
Clang「
1>------ ビルド開始: プロジェクト:ClangTest, 構成:Debug Win32 ------
1>ClangTest.cpp
1>ClangTest.cpp(6,21): warning : illegal character encoding in string literal [-Winvalid-source-encoding]
1> std::string str = "<92>N<82><82><91>O";
1> ^~~~ ~~~~~~~~~~~~~~~~~~~~
1>ClangTest.cpp(8,24): error : illegal character encoding in string literal
1> std::wstring wstr = L"<92>N<82><82><91>O";
1> ^~~~ ~~~~~~~~~~~~~~~~~~~~
1>1 warning and 1 error generated.
1>プロジェクト "ClangTest.vcxproj" のビルドが終了しました -- 失敗。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
」
そう,Clangは Shift JIS をちゃんと認識せずにコンパイルしているのです.
一個目は,マルチバイト文字をそのままソースコードから抜き出して機械語にぶち込めばいい(ワーニングだけで大丈夫)のですが,二個目は, Unicode に変換しなければなりません.よって,エラーになります.まあ,日本語とかをソースコードに含めるときは,Unicode で保存しましょっていう話です.(あと,charの型も統一しよう)
エンコーディング対応表
二つのコンパイラは,対応するエンコーディングの種類が異なるので,以下に記します.
MSVC 2017 | Clang with VS | |
---|---|---|
Shift JIS | ◎ | △ (ASCIIとして読み込み,L""リテラルは使えない) |
UTF-8 | × | 〇(char型がぐちゃぐちゃ) |
UTF-8(with BOM) | ◎ | 〇(char型がぐちゃぐちゃ) |
UTF-16 LE&BE | ◎ | × |
(文字列関係が一番萎えるんですよね…C++って…)
〆
あんまり利用場面はありませんが,MSVCやgccよりもピュアなC++が書けるので,初心者には最適だと思います.読んでいただきありがとうございました.