新世界へ

あけましておめでとうございます。
遅すぎですね。

ってことで、『MONSTER HUNTER: WORLD』が届きました。
モンハン、3Gか4くらいまではそれなりにマトモに遊んでいたんですが、それ以降はなんだか長続きせずにいます。
本作はどこまで進められるだろうか……。

【C++】デフォルトコンストラクタを持たない型の配列を初期化する

class X {
public:
  explicit X(int) {}
};


上のような、デフォルトコンストラクタのないクラスについて考えてみます。
このようなクラスのオブジェクトは、明示的にコンストラクタを呼ばなければ生成できません

X x1;      // NG
X x2(99);  // OK

X xarray1[3];          // NG
X xarray2[3] = {
  X(10), X(20), X(30)  // OK
};
続きを読む

Visual C++(cl.exe)で UTF-8 のファイルをコンパイルする

日本語版 Windows では、デフォルトの文字コードとして Shift-JIS(CP932)が広く使われています。
この Shift-JIS、2バイト目が ASCII コードと同じ、という文字がいくつか存在します。

例えば「ソ」の Shift-JIS でのコードは16進数で835cで、2バイト目の5cバックスラッシュ(または¥マーク)と同じです。
このため、例えば

#include <iostream>
int main()
{
    char str[] = "ソ";
    std::cout << str << std::endl;
    return 0;
}

上記を Shift-JIS で保存してコンパイルしてみます。
Visual Studio では問題なくコンパイル・実行できるのですが、gcc(g++)では、

error: missing terminating " character
     char str[] = "▒\";
                  ^

怒られました。
「ソ」の2バイト目と、それに続くダブルクォーテーションがエスケープシーケンスとして処理されてしまうため、文字列の終わりを表すはずのダブルクォーテーションが文字列に含まれてしまい、文字列が終わっていないというエラーになってしまうわけです。

Shift-JIS に対応していないツールでは、似たような問題はしょっちゅう顕在化します。
いわゆる「ダメ文字」問題ですね。
「ダメ文字」でググるといろいろ情報が出てくると思います。


てことで本題。
ファイルの文字コードに Shift-JIS なんて使うのはやめて、UTF-8 を使うようにしよう!

続きを読む