• 締切済み

漢字のコメントをはずすとコンパイルできる

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の日本語コメントを、コメントとして認識させる」 ためには、どうしたらよいのかお教えください。

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答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行目を示してい (るつもりになってい) ます.

  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.8

> /* コメント */ に変更しましたら、 > error C2001: 定数が 2 行目に続いています。 > に変わりました。相変わらずです。 なるほど、コメントだけの単純な問題ではなかったのですね。 > 欲を言えば、 > ソースリストはいじらずに、VisualStadio側の設定 > で何とかしたいです。 手段に対する条件付けをしていると、今後苦労されますよ。 どのような苦労かというと、手段を発見しにくいとか、クライアントとぶつかるとかです。 まあ、柔軟性に欠けるということですね。 #大きなお世話で失礼しました。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.7

どうしてもVisual Studioの設定でどうにかしたいのであれば、ビルド前イベントでBOMを付加するか、シフトJISに変換するプログラムを実行するように設定するしかありませんね。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答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/609vsfileencode/vsfileencode.html
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.5

#2です。 > BOMって、ファイル先頭の 0xFEFF ですか? UTF-8の場合は、0xef 0xbb 0xbfの3バイトです。

usatan2
質問者

お礼

回答、ありがとうございます。 3バイトだったのですね。 VisualStadio側の設定で何とかするつもりでしたが、思いもかけない解決策でしたが、 エラーなく、コンパイルできました!

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

2008 ではなく 2010 で試してみましたが, 俗にいうところのBOM と改行コードが絶妙に絡んでいる感じです. そのエラーメッセージは何行目を示していますか? おそらく適切なのは「俗にいうところのBOM をつける」だと思います... が.... UTF-8 に「バイトオーダー」なんてものは存在しないんだから, いい加減「BOM」って表現は (UTF-8 のときには) すべきではないと思う.

usatan2
質問者

お礼

回答、ありがとうございます。 >そのエラーメッセージは何行目を示していますか? 7行目(elseのある行)です。 >おそらく適切なのは「俗にいうところのBOM をつける」だと思います... が.... ソースリストの先頭に 0xef 0xbb 0xbfの3バイト を追加(BOM)することで、エラーなく、コンパイルできるようになりました。 雑誌などに記載のサンプルプログラムをコピーするので、欲を言えば、  ソースリストはいじらずに、VisualStadio側の設定 で何とかしたいです。ご存知でしょうか?

  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.3

改行コードの影響と思います。 Shift-JISではCRLFですが、UTF-8ではLFではなかったでしょうか。 書かれた漢字の中にLFに相当するコードがあるものと思われます。 /* コメント */ の形式では如何ですか? 現在のコンパイラが扱っているかどうかは確認していませんけど。 これは行をまたがってコメントが書ける形式です。

usatan2
質問者

お礼

回答、ありがとうございます。 ソースリストは、雑誌にのっていたサンプルプログラムをそのまま使用しています。 確かに、改行コードはCRLFでなく、LFだけでした。 /* コメント */ に変更しましたら、 error C2001: 定数が 2 行目に続いています。 に変わりました。相変わらずです。 ソースリストの先頭に 0xef 0xbb 0xbfの3バイト を追加(BOM)することで、エラーなく、コンパイルできることは 確認できましたが、欲を言えば、  ソースリストはいじらずに、VisualStadio側の設定 で何とかしたいです。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

Visual C++はUTF-8のソースファイルはBOMが必要になります。 BOM無しでコンパイルしようとしているのではないでしょうか?

usatan2
質問者

お礼

回答ありがとうございます。 BOMって、ファイル先頭の 0xFEFF ですか? 追加してみましたが、だめでした。 というか、追加したら、VCの画面で文字化けしたソースとして表示されてしまいました。

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.1

環境が認識しない以上どうしようもないと思います 可能性として 対応アップデート(修正パッチ)を延々と待つとか(いまさらでないと思うけど) と書いて もしかしたら 認識できない文字の前に \ 書くと認識できるかもしれません (環境ある分けてはないので確認してるわけではありません)

usatan2
質問者

お礼

回答、ありがとうございます。 VisualStadio側の設定で何とかするつもりでしたが、 ソースリストの先頭に 0xef 0xbb 0xbfの3バイト を追加(BOM)することで、エラーなく、コンパイルできるようになりました

関連するQ&A

  • main( )

    次の様なプログラムを作りました。 Dosプロンプトを開き、コンパイルで出来た、exeファイルのアドレスを渡しました。 例えば、2と3を引数として渡す時、 2 スペースを押す、 3 enter  の順に行うと、エラーになります。 どの様に、引数を渡すのか操作方法を教えてください。 お願いします。 #include<stdlib.h> #include<stdio.h> int main(int argc, char *argv[]) {    if(argc!=3){     printf("2つの数を指定してください。");     exit(1);    }     printf("%f",atoi(argv[1])+atoi(argv[2]));    return 0; }

  • 簡単なコンパイルができない。

    ごく簡単なコンパイルができません・・。 #include<stdio.h> int main(){ int i; i = 1; printf("%d" , i); return(0); } でコンパイルすると Borland C++ 5.5.1 for Win32 Copyright (c) 1993,2000 Borland C:\TM-C\c\sam.c: 警告 W8065 C:\TM-C\c\sam.c 5:プロトタイプ宣言のない関数'printf'の呼び出し(関数 main) Turbo Incremental link 5.00 Copyright (c) 1997,2000 Borland Fatal: ファイル C0X32.PBJ が開けません と表示されてコンパイルできません・・。 プロトタイプ宣言ってこの場合いらないんじゃ・・。 どなたか教えてください:;

  • ポインタについて

    こんにちは。「独習C」で独学している者です。その中の練習問題をやっていました。課題はコマンドラインから引数を受け取り各文字に1を加え暗号化して表示するというものでした。 自分で考え一応ちゃんと動くものが書けました。その後もっとシンプルにならないかと少しずつ余分な所を削っていき以下のようになりました。 #include <stdio.h> int main(int argc,char *argv[]) { char ch; if(argc != 2){ printf("引数が正しくありません"); exit(1); } else while(*argv[1] != '\0'){ printf("%c",*(argv[1]++) + 1); } return 0; } できた、できたと喜んでいたのですがソースをよく見ていると*(argc[1]++)の所を見てあれっと思いました。これでは文字列の二番目の要素からしか表示できないのではないのかと思ったのです。しかし動かすとちゃんと動くのです。ちゃんと1番目の要素も表示されるのです。自分としては++を消して次の行にargv[1]++を付け加えればいいと思ったのですがどうでしょうか?(←これでもちゃんと動きました)私のポインタに対する考え方が間違っているのでしょうか?よろしくお願いします。

  • C++のクラスの可変引数化を禁止する方法。

    C++のクラスの可変引数化を禁止する方法。 クラスのインスタンスをprintfの引数にするのをコンパイル・エラーにする方法はないでしょうか? コピーコンストラクタや代入のオーバーロードをprivateにしてもエラーが出ないので方法を探しています。 #include "stdafx.h" class CTest { private: int intdata; public: CTest() : intdata(0) { }; private: void operator =(const CTest& src) {} CTest(const CTest& src) {} }; int _tmain(int argc, _TCHAR* argv[]) { CTest ctest; printf( "%s %p\n", ctest, ctest ); return 0; }

  • コンパイルソフトがないのでよろしくお願いします。

    #include <stdio.h> int main(int argc, char *argv[]) { FILE *fp; char gyou[1024]; int gyousuu = 0; if ( argc < 2 ){ printf("file mei ga nai\n"); return -1; } fp = fopen(argv[1], "r"); if ( fp == NULL ){ printf("fopen dekinai\n"); return -2; } while(fgets(gyou, sizeof(gyou), fp) != NULL){ gyousuu++; } fclose(fp); printf("gyousuu=%d\n", gyousuu); return 0; }    以上のプログラムはご覧のとおり、「ファイルの行数を計算」のプログラムです。   参考書には -----------------------------------  ファイル名 ソースファイル example9.c   MSYSでコンパイル後のプログラム名 example9.exeとなる。   Mingシェルで呼び出して、同ファイルの   参考書 には    $ example9.c -o example9.exe として   実行結果が    gyousuu=22 ------------------------------- 以上が参考書の作業の流れです。    ここで質問があります。 参考書は「ファイル行数を計算する」example9.c のファイルを呼び出して  gyousuu=22  だと結果を出していますが、ほかのプログラムを呼び出した場合も  gyousuu=○○ と出るのでしょうか!?  以上 変な質問かもしれませんが 全国皆様 お付き合いをよろしくお願いいたします。

  • 分割コンパイルの手順と方法について

    Visual Studio 2010でファイルを分割してコンパイル、リンクする方法がわかりません。以下のような3つのファイルです。 [myfunc.h] /* max関数の宣言 */ int max(int x, int y); [myfunc.c] int max(int x, int y) { if (x > y) return x; else return y; } [Sample13.c] #include <stdio.h> #include "myfunc.h" int main(void) { int num1, num2, ans; printf("1番目の整数を入力してください。\n"); scanf("%d", &num1); printf("2番目の整数を入力してください。\n"); scanf("%d", &num2); ans = max(num1, num2); printf("最大値は%dです。\n", ans); return 0; } 以上3つのファイルはあくまでも便宜的なもので、複数のファイルのコンパイル・リンクの手順を具台的に理解するために 用意したものです。

  • エラー C言語 プログラミングについて

    #include<stdio.h> int leapYear(int); int main(void){ int year,i; for(i=2001;i=2999;i++){ year=i; printf("%d leap = %d \n",i,leapYear(int year)); return 0; } } int leapYear(int year){ if(year%100==0){ return 0; } else if(year%400==0){ return 1; } else if(year%4==0 && year%100!=0){ return 1; } } をコンパイルすると11行目に式の構文エラーが出るんですが どうしてでしょうか?? 間違ってない気がするんですけど。。

  • gccですが、コンパイルができません!

    以下のプログラムですが #include <stdio.h> int main() { Int col; char i; scanf( "%d", &col ); for( i = 0 ; i < 26 ; i++ ){ if( i > 0 && ( i % col ) == 0 ) printf( "\n" ); printf( "%c", 'a' + i ); } return 0; } 以上のプログラムをgccでコンパイルしました。 コンパイルするために入力した文字→  gcc p.c -o p.exe 以下のエラーがでてコンパイルできません。 p.c: In function `main': p.c:4: error: `Int' undeclared (first use in this function) p.c:4: error: (Each undeclared identifier is reported only once p.c:4: error: for each function it appears in.) p.c:4: error: syntax error before "col" p.c:7: error: `col' undeclared (first use in this function) p.c:17:2: warning: no newline at end of file  以上なぜコンパイルができないのですか? よろしくお願いいたします。

  • C++のコンパイルエラーが

    おこります。 --------------------------------- #include <stdio.h> int main(void) { printf("hello, world\n"); return 0; } -------------------------------------- をコンパイルするのですができません。 以下のエラーが出ます。 --------------------------------------- エラー E2209 sample.c 1: インクルードファイル 'stdio.h' をオープンできない 警告 W8065 sample.c 5: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main ) *** 1 errors in Compile *** -------------------------------------

  • コンパイルすると‥‥

    C言語です。 emacsでC言語のプログラムを作りました。 #include<stdio.h> int main() { float x; printf("データを入力してください\n"); scanf("%f",&x); printf("%fを受け取りました\n",x); return 0; } といった簡単なプログラムです。 これをコンパイルすると 画像のようなものが表示されて どうしたら良いのか困ってます。 僕が思うにもはやプログラムに問題があるのではなく パソコンの設定に問題があるのかな? と思っているのですがどうしたら良いのかがわかりません。。。 分かる方、よろしくお願いします。

専門家に質問してみよう