2011年11月11日金曜日

VC++とGCCのコードの共存

ソースの文字コードと改行コードはとある規定により UTF-8 LF で保存することになっています。

ところが VC++2005 では SJIS CRLF じゃないと都合が悪い?ようでいろいろ問題が出ます。。


  • UTF-8

ビルド時、C4819のワーニングが出ます。

どうもVC++はSJISかBOM付UTF-8をご所望のご様子

参考:[VS2005]やたらに警告C4819が発生する

抑止するには #pragma を使うのがひとつと、VC上プロジェクトのプロパティでたしか[C/C++]-[詳細]-[無視する警告]とか設定があったと思います。これで指定すれば黙ってくれます。

ちなみに VC++は UTF-8 BOM付 なら大丈夫なようですが、今度は GCC が処理できなくなります。



  • LF

改行コードの問題とUTF-8の文字コードを適切に処理できないことのコンボなんでしょうが、、ビルド時に不可解なエラーに遭遇します。

日本語コメントの前後でエラーが頻発します。

どうすればいいかというと、

// コメントです[↓]    ※ [↓]は改行を表す



// コメントです [↓]

とすればいいようです。(改行の前にスペースを挿入する)


もうひとつは、、日本語のコメントを書かないことです。。(むり)


もしコメントを削除してもかまわないようなら

//.*\n ==> //\n

と正規表現を使った置換で削除してもいいと思います。

(/* コメント */ の削除の仕方はわからない。。)



  • 文字コード、改行コード変換


$ nkf -w -Lu --in-place ファイル

-w はUTF-8への変換
-Lu はLFへの変換

--in-place はファイル上書き指定(タイムスタンプ更新)

--overwrite ではなく、 --in-place を使います。
--overwrite はタイムスタンプの更新をしないため、svn などを使っていたときにファイル内容に変更があるにも関わらずタイムスタンプを見て変更がないと判断されてしまうという現象があるためです。(当たり前の仕様ですが)


  • 文字コード、改行コードの調べ方


文字コードの種類や改行コードは file コマンドで調べることも可能です。

ASCII C program text, with CRLF line terminators

UTF-8 Unicode C program text

という具合に表示されます。

また秀丸を使っているなら、
http://d.hatena.ne.jp/ikuramura/edit?date=20100116
[その他]-[動作環境]で『上級者向け設定』にチェックを入れて、[ウィンドウ]-[高度なウィンドウ]-『エンコードの種類』を『常に表示+改行コード』にすればそのファイルの文字コードと改行コードの種類がタイトルバーに表示されるようになります。

1 件のコメント:

  1. すでに旧いトピですが、/* ... */類のコメントに対して、次の正規表現に引かがります

    /\*.*\*/

    ただし、一行限りかもしれません…
    試しにエディタに正規表現で置き換えをしたところ、微妙にコメント以外のところもひかかります…結論としては日本語のコメントは//だけに使いましょうと

    たまにコードを大範囲に/* */を使ってコメントアウトもするから、/* */を削除しないほうが良いでしょうかなって感じです

    返信削除