
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の日本語コメントを、コメントとして認識させる」
ためには、どうしたらよいのかお教えください。
A 回答 (9件)
- 最新から表示
- 回答順に表示
No.9
- 回答日時:
「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行目を示してい (るつもりになってい) ます.
No.8
- 回答日時:
> /* コメント */ に変更しましたら、
> error C2001: 定数が 2 行目に続いています。
> に変わりました。相変わらずです。
なるほど、コメントだけの単純な問題ではなかったのですね。
> 欲を言えば、
> ソースリストはいじらずに、VisualStadio側の設定
> で何とかしたいです。
手段に対する条件付けをしていると、今後苦労されますよ。
どのような苦労かというと、手段を発見しにくいとか、クライアントとぶつかるとかです。
まあ、柔軟性に欠けるということですね。
#大きなお世話で失礼しました。
No.7
- 回答日時:
どうしてもVisual Studioの設定でどうにかしたいのであれば、ビルド前イベントでBOMを付加するか、シフトJISに変換するプログラムを実行するように設定するしかありませんね。
No.6
- 回答日時:
ちょっと調べてみると, いろいろなものが絡みあっているように見えます.
まず, 俗にいうところのBOM がないと Shift_JIS と思ってファイルを解釈します (日本の場合). よ~するに, この「俗にいうところのBOM」は「UTF-8 と Shift_JIS を区別する」ための符号です (そのために使うこと自体は Unicode Consortium でも想定している). 言い換えると「UTF-8 として扱ってほしいなら俗にいうところのBOM は必ず付けろ」ってことです. これは「VisualStudio の設定」などでなんとかなるような甘っちょろいものではありません. あきらめるか Microsoft を突っ突くかしてください.
まぁ, VisualStudio でファイルを保存するときに文字コードの設定はできるんだけど, しょせん「ファイルを保存するときに使う文字コードを決める」ことしかできないのでコンパイラの挙動そのものには何も影響しない.
「雑誌などに記載のサンプルプログラムをコピーするので、欲を言えば、
ソースリストはいじらずに、VisualStadio側の設定
で何とかしたい」
が何をいっているのかはわかりません.
参考URL:http://www.atmarkit.co.jp/fdotnet/dotnettips/609 …
No.5
- 回答日時:
#2です。
> BOMって、ファイル先頭の 0xFEFF ですか?
UTF-8の場合は、0xef 0xbb 0xbfの3バイトです。
回答、ありがとうございます。
3バイトだったのですね。
VisualStadio側の設定で何とかするつもりでしたが、思いもかけない解決策でしたが、
エラーなく、コンパイルできました!
No.4
- 回答日時:
2008 ではなく 2010 で試してみましたが, 俗にいうところのBOM と改行コードが絶妙に絡んでいる感じです. そのエラーメッセージは何行目を示していますか?
おそらく適切なのは「俗にいうところのBOM をつける」だと思います... が....
UTF-8 に「バイトオーダー」なんてものは存在しないんだから, いい加減「BOM」って表現は (UTF-8 のときには) すべきではないと思う.
回答、ありがとうございます。
>そのエラーメッセージは何行目を示していますか?
7行目(elseのある行)です。
>おそらく適切なのは「俗にいうところのBOM をつける」だと思います... が....
ソースリストの先頭に 0xef 0xbb 0xbfの3バイト
を追加(BOM)することで、エラーなく、コンパイルできるようになりました。
雑誌などに記載のサンプルプログラムをコピーするので、欲を言えば、
ソースリストはいじらずに、VisualStadio側の設定
で何とかしたいです。ご存知でしょうか?
No.3
- 回答日時:
改行コードの影響と思います。
Shift-JISではCRLFですが、UTF-8ではLFではなかったでしょうか。
書かれた漢字の中にLFに相当するコードがあるものと思われます。
/* コメント */
の形式では如何ですか?
現在のコンパイラが扱っているかどうかは確認していませんけど。
これは行をまたがってコメントが書ける形式です。
回答、ありがとうございます。
ソースリストは、雑誌にのっていたサンプルプログラムをそのまま使用しています。
確かに、改行コードはCRLFでなく、LFだけでした。
/* コメント */ に変更しましたら、
error C2001: 定数が 2 行目に続いています。
に変わりました。相変わらずです。
ソースリストの先頭に 0xef 0xbb 0xbfの3バイト
を追加(BOM)することで、エラーなく、コンパイルできることは
確認できましたが、欲を言えば、
ソースリストはいじらずに、VisualStadio側の設定
で何とかしたいです。
No.1
- 回答日時:
環境が認識しない以上どうしようもないと思います
可能性として 対応アップデート(修正パッチ)を延々と待つとか(いまさらでないと思うけど)
と書いて
もしかしたら 認識できない文字の前に \ 書くと認識できるかもしれません
(環境ある分けてはないので確認してるわけではありません)
回答、ありがとうございます。
VisualStadio側の設定で何とかするつもりでしたが、
ソースリストの先頭に 0xef 0xbb 0xbfの3バイト
を追加(BOM)することで、エラーなく、コンパイルできるようになりました
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
” OS ビルド ” の意味が分か...
-
初歩的プログラミング(C言語)
-
動的な変数名のつけ方について
-
VBAを何回も作り直して、容量が...
-
DirectX9SDKが入ってるPCでDi...
-
クリティカルエラー Expressio...
-
マクロ コンパイルがグレーバック
-
漢字のコメントをはずすとコン...
-
Makefile作成時の拡張子.oとは?
-
C++/CLIで、アンマネージC++のD...
-
pyc 編集 閲覧
-
外部シンボル "_main"は未解決です
-
サンプルスケッチをそのまま使...
-
コンパイル??
-
関数形式マクロ
-
VB6で開発中…標準モジュール間...
-
プリコンパイルエラーについて
-
ビルドから除外されたソースの...
-
Borland C++ 5.5
-
BRC32.exeは本当にリンクも出来...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
” OS ビルド ” の意味が分か...
-
VBAを何回も作り直して、容量が...
-
エクセルVBAではRound...
-
C言語でヘッダファイルにグロー...
-
1 つ以上の複数回定義されてい...
-
「fatal error C1189」を回避す...
-
Makefile作成時の拡張子.oとは?
-
外部シンボル "_main"は未解決です
-
<math.h>があるのにsqrtが・...
-
ILSpyで、デコンパイルできない。
-
クリティカルエラー Expressio...
-
マクロ コンパイルがグレーバック
-
【VC++6.0(MFC)】警告「LINK : ...
-
セミコロンについて
-
複数のサブディレクトリを一緒...
-
C言語のコンパイルができません
-
PRO*C コンパイルエラー
-
ExcelVBAで『ByRef 引数の型が...
-
コンパイルエラー:ユーザ定義...
-
プリコンパイルエラーについて
おすすめ情報