何らかの理由によりVC++のエディタ画面以外でコードを編集したいと言う事はよく有る。そういった時、いざVC++でコンパイルしようとした時に警告が発生する事がある。
例えば以下のようなコードを何らかのテキストエディタで記述し、UTF-8で保存する。
#include <iostream>
using namespace std;
int main()
{
cout << "このプログラムには日本語の文字列が含まれています。" << endl;
}
で、これをコンパイルすると、以下のような警告/エラーが発生する事が有る。
test.cpp : warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。
test.cpp(6) : error C2001: 定数が 2 行目に続いています。
test.cpp(7) : error C2143: 構文エラー : ';' が '}' の前にありません。
しかし、全く同じコードをVC++のIDEにて作成した場合はエラーとならない。
何故か。
どうやら、VC++でUTF-8なソースコードをコンパイルしようと思ったら、BOMが必要となるらしい。
エラーメッセージの現在のコード ページ (932)という記述から推察するに、BOMが無ければCP932として処理しているのだろう。
IDE上で文字化けする訳でもないのに、不思議な話である。
VC++ 2010にてファイルの文字コードを変更するには、"ファイル"メニューの"名前を付けて (ファイル名) を保存"から保存し直せば良い。この時、"名前を付けてファイルを保存"ダイアログの"保存"ボタン右の下向き三角形をクリックし、"エンコード付きで保存"を使う必要が有る。
ただ単に警告が出るだけであれば、無視するなり、#pragma warning(disable: 4819)
を指定するなりしても良いのだが、恐ろしい事に、他のエラーや警告を同時発生させる事がある。上に挙げたコードが正にその例となっており、文字コード誤判断の結果、error C2001とerror C2143が発生しているのが分かる。
warning C4819が発生している状態で、なおかつ原因の分からないコンパイルエラーが発生しているのであれば、コードの文字コードに注意を払う必要が有るだろう。
謝辞
THX @cpp_akira!!
- 何らかの理由により
- コーディングにはVim使いたいとか。
- VC++でコンパイル
- VC++付属のclコマンドも含む。
- BOM
- UTF-8でのそれは、正確には"Byte Order Mark"という訳ではないが。