Xcodeでなんか知らんけど原因不明なエラーが大量に出る


Xcodeで原因不明なExpected ~~~ なエラーが出る

これを読んで解決するかもしれない人

  • 意味不明なエラーが出てビルドが通らない人
  • その中でEmacsやそのキーバインディングをいつも使っている人
  • その上Xcodeを使っている人

環境

macOS: 1.14.2
Xcode: 10.1(この問題自体は前々からある模様)

TL;DR

  • Xcode + C++ + Siv3Dでゲームの設計中に謎のエラー
  • 謎のエラーというわけではなく、エラーメッセージは単純だが、出る原因がわからない
  • 出るやつ
    • Expected member name or ';' after declaration specifiers
    • Expected unqualified-id
    • Expected Expression

どういう所で出たのか

Looper.hpp
class Looper final {
public:
    Looper();
    bool loop() const;        //Expected Expression
};
Looper.cpp
// 前略
bool Looper::loop() const {
    return true;              //Expected Expression
}
SystemMain.hpp
class SystemMain final {
public:
    SystemMain() = default;;

    bool init();
    bool main();
    bool exit();
};
                              //この行でExpected unqualified-id
Define.cpp
class Define final {
public:
    const static int WINDOW_W;
    const static int WINDOW_H;

    const static double PI;   //Expected member name or ';' after declaration specifiers
};

考察

  • 文法的に正しいように見える所でも発生している
  • 空行ですら発生している
    • 文法的問題ではない?
    • 全角スペースではないことを確認した
      -> 全角スペース以外の見えない文字
      -> 制御文字か?

検証

問題の部分をバイナリエディタで見てみる

Define.hpp
00000100  20 20 20 20 0a 20 20 20  20 63 6f 6e 73 74 20 73  |    .    const s|
00000110  74 61 74 69 63 20 64 6f  75 62 6c 65 20 13 50 49  |tatic double .PI|
00000120  3b 0a 7d 3b 0a 0a 0a 23  65 6e 64 69 66 20 2f 2a  |;.};...#endif /*|
SystemMain.hpp
00000120  65 78 69 74 28 29 3b 0a  7d 3b 0a 13 0a 23 65 6e  |exit();.};...#en|

なんかDefine.hppの0x11DとSystemMain.hppの0x12B入力するはずのない0x13が見える...?
Asciiコード表で確認してみると

| 0x13 | DC3(装置制御3) |

...なんで?

原因

  • 原因はXcodeでミスってc-x sを押しまくってしまうこと

Xcode ascii 0x13とかでググってみても情報が無い、
けどふと思った、いつもEmacs使っているのでよく間違って C-x sをやっている...
-> 入力するとそこに0x13が挿入されることを確認
-> なんか知らんけどXcodeはc-xをすると0x13が挿入されてしまう模様

解決策

Preference -> KeyBindingsを見てみると

こんなのを発見、おそらくXcodeでのMark Yankをするために内部的に0x13を入れているのだと思われる(要出典)
どうせこれは使わないので無効化して、今ある0x13を消すと同様の問題は発生しなくなった

Xcodeでも完璧にEmacsのキーバインディングが使いたい....