【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 を使うようにしよう!

続きを読む

MSYS2 入れてみたけど、pacman がうまく動かなくて困ってた

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


cmd.exe がイマイチ使いづらいので、Windows での良さげなシェル環境を模索しています。
いろいろ調べてみて、ConsoleZ + Nyagos がわりといい感じに使えそうだなーと思って使ってみていますが、MSYS2 もよく耳にするので試しに入れてみました。

……が、パッケージマネージャである pacman が動いてくれない
こんなエラーが出まくる。

エラー: GPGME error: 無効な暗号エンジンです


ググってみてもなかなかそれらしい答えにたどり着けなかったのですが、
GPGME error: Invalid crypto engine · Issue #393 · Alexpux/MSYS2-packages · GitHub
ここで "MacType can cause this." という文言を見かけました。
ええ、MacType 使っておりますがなにか。

もしかしたらこれかもなー、と思って試してみたら、うまく動くようになりました。

MacType のインストールディレクトリ(C:\Program Files\MacType\ とか)にある MacType.ini に以下を追加:

[UnloadDll]
gpg.exe
pacman.exe


備忘録として一応残しておきます。