LoginSignup
6
4

More than 5 years have passed since last update.

Clang on VisualStudio 2017と日本語

Posted at

これは,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で「変更」ボタンの場所
VisualStudio Installer を起動して インストール済み VS の 変更 ボタンを押します.

クリップボード01.jpg
個別のコンポーネントタブを開き, Clang with Microsoft CodeGen を選択,右下の 変更 ボタンを押して,数分程度昼寝してれば,インストールは終了です.

ソリューションの準備

とりあえず,コンソールアプリケーションを作りたいので,普通に Visual C++ → Win32 → Win32 コンソールアプリケーションとたどってソリューションを作ります.

クリップボード01.jpg

そして,上の画像のように,「プラットフォーム ツールセット」を VisualStudio 2017 - Clang with Microsoft CodeGen なんちゃら にしてやればおkです.

日本語は大丈夫なのか?

ちゃんと書けば,大丈夫です.

ClangTest.cpp
#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++が書けるので,初心者には最適だと思います.読んでいただきありがとうございました.

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4