環境に依存しないコードだってことでとりあえずMacとXcodeで開発して、一応動作確認しておくかという段になって初めてVisualStudio2013に持っていったら怪しいコンパイルエラーが頻出してどうにもこうにも困ったことになった。
状況
そのときの状況を僕のTwitterと共に振り返ってみる。
まずVisualStudioのコンパイラのせいだと決めつける。
Updateがあるかどうかを調べ、あったので適用してみる。
アップデート待ちの間にもう少し調べてみる。
アップデートしても結局だめで、日本語コメントの辺りをいじっていたらコンパイルが通ることがわかった。文字コードの警告をそのままにしておくとダメだということだね
原因
Macでコードを書いたので文字コードはUTF-8になっている。このファイルをVisual Studioに開くと、BOMがないために正しく解釈されないらしい。そんな状態で構文解析をするもんだからコンパイルエラーがでるようだ。
BOMというのは、↓こういうもの。
Unicodeの符号化形式で符号化したテキストの先頭につける数バイトのデータのことである。このデータを元にUnicodeで符号化されていることおよび符号化の種類の判別に使用する。
解決法
全てのソースコードにBOM付けてあげればよい。Visual Studioで「名前をつけて保存」→「エンコード付きで保存」でもBOMはつくらしいが、ファイル数が多いとそんなことはやってられない。
そこでnkf
コマンドを使い、一括処理することにする。nkfでは以下のコマンドでBOMの付与ができる。
% nkf --overwrite --oc=UTF-8-BOM filepath
ソースコードのルートディレクトリからfind
コマンドと組み合わせて使えば一括処理が可能だ。
例えば、.h
、.c
、.cpp
ファイルを変換するならこうすればいい(3行に分けずにできそうだけど、そこまでがんばることはない)。
% find . -name "*.h" -exec nkf --overwrite --oc=UTF-8-BOM {} \;
% find . -name "*.c" -exec nkf --overwrite --oc=UTF-8-BOM {} \;
% find . -name "*.cpp" -exec nkf --overwrite --oc=UTF-8-BOM {} \;
これでVisual Studioで警告もでなくなるし、コンパイルエラーもなくなる。よかった。