- 締切済み
漢字のコメントをはずすとコンパイルできる
Visual Stadio 2008 の C++ で以下の簡単なプログラムをコンパイルすると、 error C2059: 構文エラー : 'else' error C2059: 構文エラー : 'return' error C2059: 構文エラー : '}' のようにエラーが出ます。 ------------- #include <stdio.h> int main(int argc, char** argv) { // 引数が指定されていた場合 if( argc == 2 ){ printf("引数があります"); }else{ printf("引数がありません"); } return 0; } ---------- いろいろ試してみたところ、 ・コメントをはずすと、コンパイルできる ・ソースリストはUTF-8である ・同内容をShiftJISで記載すると、コンパイルできる ことに気がつき、 「UTF-8の日本語コメントを、コメントとして正しく認識していない」らしい ことが原因らしいところまでわかりました。 で質問になりますが、 「UTF-8の日本語コメントを、コメントとして認識させる」 ためには、どうしたらよいのかお教えください。
- みんなの回答 (9)
- 専門家の回答
みんなの回答
- Tacosan
- ベストアンサー率23% (3656/15482)
「error C2001: 定数が 2 行目に続いています。」というエラーメッセージ自体は, 6行目の "引数があります" の最後の " が認識されていないことによります>#8. まじめに文字コードを追っていないのでてきと~に書きますが, 最後の「す」の 3バイト目とそのあとの " で Shift_JIS における 1文字と認識されているっぽいです. 一方もともとの問題はさらに微妙で ・俗にいうところのBOM がないために Shift_JIS と認識されている ・コメントの最後の「場合」の「合」とそのあとの文字がまとめて 1文字と認識されているっぽい ・結果, 改行コードが LF だとこのが「合」の 3バイト目に食われて見えなくなってしまう ・つまり, 次の if~ の行もコメントの中にあると勘違いされている ということによると推測されます. 実際, (2010 ですが) プリプロセッサの結果を見ると見事に if~ の行まで消えています. 試してみると ・改行コードを CRLF にする→if~の行がきちんと認識される ・コメントを /* 引数が指定されていた場合 */ とする→同上 ・コメントを /* 引数が指定されていた場合*/ とする→if~の行は無視され, 最後までコメントの中にあると勘違いされる という結果になります. 余談ですが, もともとのソース (改行は LF) に対して cl でコンパイルすると hoge.c(5) : error C2001: 定数が 2 行目に続いています。 というエラーメッセージが出ます (エラー行を 5行目と思っている). IDE ではあたかも 6行目にあるように見えますが, メッセージを見ればわかるように IDE 自身は 5行目を示してい (るつもりになってい) ます.
- Tasuke22
- ベストアンサー率33% (1799/5383)
> /* コメント */ に変更しましたら、 > error C2001: 定数が 2 行目に続いています。 > に変わりました。相変わらずです。 なるほど、コメントだけの単純な問題ではなかったのですね。 > 欲を言えば、 > ソースリストはいじらずに、VisualStadio側の設定 > で何とかしたいです。 手段に対する条件付けをしていると、今後苦労されますよ。 どのような苦労かというと、手段を発見しにくいとか、クライアントとぶつかるとかです。 まあ、柔軟性に欠けるということですね。 #大きなお世話で失礼しました。
- jacta
- ベストアンサー率26% (845/3158)
どうしてもVisual Studioの設定でどうにかしたいのであれば、ビルド前イベントでBOMを付加するか、シフトJISに変換するプログラムを実行するように設定するしかありませんね。
- Tacosan
- ベストアンサー率23% (3656/15482)
ちょっと調べてみると, いろいろなものが絡みあっているように見えます. まず, 俗にいうところのBOM がないと Shift_JIS と思ってファイルを解釈します (日本の場合). よ~するに, この「俗にいうところのBOM」は「UTF-8 と Shift_JIS を区別する」ための符号です (そのために使うこと自体は Unicode Consortium でも想定している). 言い換えると「UTF-8 として扱ってほしいなら俗にいうところのBOM は必ず付けろ」ってことです. これは「VisualStudio の設定」などでなんとかなるような甘っちょろいものではありません. あきらめるか Microsoft を突っ突くかしてください. まぁ, VisualStudio でファイルを保存するときに文字コードの設定はできるんだけど, しょせん「ファイルを保存するときに使う文字コードを決める」ことしかできないのでコンパイラの挙動そのものには何も影響しない. 「雑誌などに記載のサンプルプログラムをコピーするので、欲を言えば、 ソースリストはいじらずに、VisualStadio側の設定 で何とかしたい」 が何をいっているのかはわかりません.
- jacta
- ベストアンサー率26% (845/3158)
#2です。 > BOMって、ファイル先頭の 0xFEFF ですか? UTF-8の場合は、0xef 0xbb 0xbfの3バイトです。
- Tacosan
- ベストアンサー率23% (3656/15482)
2008 ではなく 2010 で試してみましたが, 俗にいうところのBOM と改行コードが絶妙に絡んでいる感じです. そのエラーメッセージは何行目を示していますか? おそらく適切なのは「俗にいうところのBOM をつける」だと思います... が.... UTF-8 に「バイトオーダー」なんてものは存在しないんだから, いい加減「BOM」って表現は (UTF-8 のときには) すべきではないと思う.
お礼
回答、ありがとうございます。 >そのエラーメッセージは何行目を示していますか? 7行目(elseのある行)です。 >おそらく適切なのは「俗にいうところのBOM をつける」だと思います... が.... ソースリストの先頭に 0xef 0xbb 0xbfの3バイト を追加(BOM)することで、エラーなく、コンパイルできるようになりました。 雑誌などに記載のサンプルプログラムをコピーするので、欲を言えば、 ソースリストはいじらずに、VisualStadio側の設定 で何とかしたいです。ご存知でしょうか?
- Tasuke22
- ベストアンサー率33% (1799/5383)
改行コードの影響と思います。 Shift-JISではCRLFですが、UTF-8ではLFではなかったでしょうか。 書かれた漢字の中にLFに相当するコードがあるものと思われます。 /* コメント */ の形式では如何ですか? 現在のコンパイラが扱っているかどうかは確認していませんけど。 これは行をまたがってコメントが書ける形式です。
お礼
回答、ありがとうございます。 ソースリストは、雑誌にのっていたサンプルプログラムをそのまま使用しています。 確かに、改行コードはCRLFでなく、LFだけでした。 /* コメント */ に変更しましたら、 error C2001: 定数が 2 行目に続いています。 に変わりました。相変わらずです。 ソースリストの先頭に 0xef 0xbb 0xbfの3バイト を追加(BOM)することで、エラーなく、コンパイルできることは 確認できましたが、欲を言えば、 ソースリストはいじらずに、VisualStadio側の設定 で何とかしたいです。
- jacta
- ベストアンサー率26% (845/3158)
Visual C++はUTF-8のソースファイルはBOMが必要になります。 BOM無しでコンパイルしようとしているのではないでしょうか?
お礼
回答ありがとうございます。 BOMって、ファイル先頭の 0xFEFF ですか? 追加してみましたが、だめでした。 というか、追加したら、VCの画面で文字化けしたソースとして表示されてしまいました。
- koi1234
- ベストアンサー率53% (1866/3459)
環境が認識しない以上どうしようもないと思います 可能性として 対応アップデート(修正パッチ)を延々と待つとか(いまさらでないと思うけど) と書いて もしかしたら 認識できない文字の前に \ 書くと認識できるかもしれません (環境ある分けてはないので確認してるわけではありません)
お礼
回答、ありがとうございます。 VisualStadio側の設定で何とかするつもりでしたが、 ソースリストの先頭に 0xef 0xbb 0xbfの3バイト を追加(BOM)することで、エラーなく、コンパイルできるようになりました
お礼
回答、ありがとうございます。 3バイトだったのですね。 VisualStadio側の設定で何とかするつもりでしたが、思いもかけない解決策でしたが、 エラーなく、コンパイルできました!