読者です 読者をやめる 読者になる 読者になる

ぬうぱんの備忘録

技術系のメモとかいろいろ

作った曲一覧はこちら

gccとVisualStudioの両方でコンパイルできるようにするには

C++ トラブルシューティング gcc VisualStudio

何があった

 emacs+gccで書いてたコードをVisualStudio 2010に持っていったらコンパイルできない! 割と意味不明なエラーでコンパイルできない! 定数が二行目に続いてますってなんだ!
 で、原因はやっぱり文字コードっぽい。だって特定の文字に反応してるっぽいんだもん。

やりたいこと

 emacs+gccでもcl(VisualStudio 2010でビルドに使ってるコンパイラ)でもどっちでも編集してコンパイルできるようにしたい。
 ただし、文字コードutf-8で。

日本語使わない

 究極的にはこれが一番確実っぽい。要は2バイト文字を排除してASCII文字だけでプログラム書きましょうって話。なので、表示するメッセージ類も全部英語に・・・。言うても短いメッセージだけだしそんなに困りませんけど・・・。

BOMについて

 UTF-8といってもBOMがあるとか無いとかって言う話があるらしいです。BOM(Byte order mark)はファイルの先頭に付く3バイトのコードで、このファイルがUTF-8であることを表すために付くことがあるらしい。BOMなしはUTF-8Uと表記されるようです。単純にUTF-8って言った場合はBOM有りを指すのが厳密なところみたいだけど、みんながみんなこのルール守ってるとも限らないので注意。

gccとclはBOM対応?

 一般的に、BOMはないほうがいいみたいな話もあるのですが、調べてみるとgccもclもBOM付きUTF-8に対応してるっぽい。むしろclはBOM無し読めないみたい。なんかgccはBOM有りNGみたいな情報もありましたが、現段階ではもう直ってるっぽい。emacsもきっとBOM有りで大丈夫。

Ubuntu上でBOMつける

 ということで、UTF-8ソースコードは全てBOMを付けてしまえば大丈夫ってことらしい。やったね!
 とりまubuntu上でUTF-8UからUTF-8Bへの変換はこちら

$nkf -W8 -w8B --in-place <入力ファイル名>

-W8で入力フォーマットを仮定し、-w8Bで出力フォーマットを指定。--in-placeでオリジナルのファイルを書き換えるように指定。
uconvでもできるけど、変換してそのまま上書き見たいなことはできないっぽい?
 BOMあるかわからない場合は

$file <調べたいファイル名>

でBOMあるかわかる。
findコマンドと併用することで、任意のディレクトリからBOM無いUTF-8のコード探してきてBOM付加みたいなこともできるみたい。
2014/01/03追記
入力文字コードを指定しないほうがいいのかもしれない

windowsでBOMつける

 変換したいファイルをメモ帳で開いて上書き保存するだけ。マジで。
なんか、メモ帳が"UTF-8を保存するときは勝手にBOMつける"みたいなハタ迷惑な仕様みたいで、それを利用します。

環境とか

一応試した環境のっけときます

  • VisualStudio 2010 Ultimate SP1
  • Ubuntu 12.04 LTS 32bit
  • gcc 4.4.7(ubuntu/Linaro 4.4.7-1ubuntu1)