こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

コンパイル時のエラーについて教えてください

よろしくお願いします。現在、Borland社のC++compiler5.5を使ってます。プログラムファイル名 は、「hello.c」です。
1: #include <stdio.h>
2:
3: int main(void)
4: {
5: printf"(hello,world");
6: return 0;
7: }
このプログラムをc:\borland\bcc55\lessonの「lesson」の中に入れてます。コマンドプロンプトで、c:\borland\bcc55\lessonに移動してから,bcc32 hello.cを実行すると,
1、エラーE2040 hello.c 1:宣言が終了していない。
2、エラーE2206 hello.c 1:不正な文字 "#"(0×23) と出ます。
何度やり直しても、同じ結果が出ます。間違いに気づかないのですが、詳しい方、ご指摘をお願いします。

投稿日時 - 2007-01-01 14:16:57

QNo.2637280

困ってます

質問者が選んだベストアンサー

★結果報告からすると、全て正常にコンパイルできています。
・前は、『bcc32 hello.cpp』でエラー『不正な文字'#' (0x23)』が出ていましたが、
 今は出ていませんね。これが正常です。
・また、『警告 W8065』は『#include <stdio.h>』をインクルードしていないので
 出てくる正常な警告メッセージです。
・なぜ、警告メッセージが出るかというと『printf』関数を使うには、その型などの
 プロトタイプ宣言が必要だからです。→型や引数をチェックするために。(規格上)
・よって、結果報告の 1 ~ 3 は正しい警告メッセージです。問題ありません。
・仮に『extern int printf( const char *format, ... );』の1行を『#include』
 の代わりに先頭に追加すれば、警告メッセージは出なくなるはずです。→確認!
・これは、『#include <stdio.h>』ファイルの中で定義されている1行ですので、
 必要な『printf』関数の部分だけを宣言すると警告メッセージは出なくなるのです。
・以上。不審な点はどこも見当たりません。→すべて正常です。

最後に:
・結果報告の 1 ~ 4 はすべて実行可能なプログラムは出来ますよね。→確認!
・そして、どれを実行しても正常な実行結果が得られたはずですよね。→再確認!
・これで、『hello.c』ファイルも正常にコンパイルできましたので、問題は解決
 しましたよ。→これで、まともな『C』の学習が出来ます。良かったですね。
・以上。アドバイスを終わります。頑張って下さい。さようなら。

投稿日時 - 2007-01-05 03:35:41

お礼

数々のご指摘とアドバイスありがとうございます。1つ1つの確認の仕方や、その内容の説明など、とても参考になりました。
これからの学習に大変助かります。今まで、知らなかったことなどずいぶんと吸収することができました。
最後の解決までお付き合いしていただき感謝しています。大変お手数をおかけしました。
ありがとうございました。

投稿日時 - 2007-01-05 22:47:28

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(14)

ANo.13

★回答者 No.9、No.10 です。
・『文字'#'(0×23)』でエラーがでる?
・もしかしたら、プリプロセッサ(#)をきちんと識別していないのでは?
・つまり、『#include <stdio.h>』の行がなくてもコンパイルでき、実行可能かもね。
・『C++』は『C』の記述も許されるため、回答者 No.12 さんの(2)でもコンパイルし
 問題ない。ってのは、私はうなずけますが…。(5)は確かにエラーになりますね。
・試しに、『#include <stdio.h>』の行をカットした main 関数、5行をコンパイルして
 結果報告をお願いします。また、次のインクルード『#include <string.h>』や
 『#include <math.h>』などを記述しても『文字'#'(0×23)』でエラーになるのか確認
 して下さい。
・もしも、エラーになった場合は、プリプロセッサ(#)を正しく認識していません。
・これもオプションで有効・無効があるか分かりませんが、このようなエラーになると
 致命的なエラーで、今後コンパイルしてもまともな『C』の学習が出来ません。
・解決策としては、一度アンインストール(削除)して、再インストールしてみましょう。
・なお、再インストールするときは、新しいのをダウンロードしてみましょう。

最後に:
・『C』の学習をするのならば、マクロソフト社の『Visual C++ 2005 Express Edition』
 というコンパイラはいかがでしょう。無料で配布されています。
・あと、参考になるリンクを6つと、ダウンロード・サイトを2つ紹介します。
・以上。おわり。→結果報告をお願いします。再インストール後の。

リンク:
http://www.kumei.ne.jp/c_lang/bcc/index.html→『Bccでプログラムを作ろう』
http://www.kumei.ne.jp/c_lang/index.html→『猫でもわかるプログラミング』
http://www9.plala.or.jp/sgwr-t/→『初心者のためのポイント学習C言語』
http://www5c.biglobe.ne.jp/~ecb/c/c00.html→『C言語入門』
http://www.bohyoh.com/CandCPP/C/Library/index.html→『標準ライブラリ関数』
http://www.cmagazine.jp/src/kinjite/c/index.html→『プログラミングの禁じ手Web版』

ダウンロード:
http://www.borland.com/jp/products/cbuilder/freecompiler.html→『BorlandR C++Compiler 5.5無償ダウンロード』
http://www.microsoft.com/japan/msdn/vstudio/express/visualc/→『Visual C++ 2005 Express Edition 日本語版』

投稿日時 - 2007-01-04 11:19:31

補足

度々のアドバイスありがとうございます。今まで、コンパイル時に、「bcc32  hello.cpp」を入力するとエラーが出ていたのですが、
プログラム実行の時点では、「hello,world」と表示されるようになったため、半信半疑ながら安心していました。
しかし、気になっていたので、
「アンインストール、再インストール、設定の見直し。」をした結果、今現在、コンパイルエラーは出なくなりました。また、ご指摘の項目も確認してみました。
結果を報告しますのでどこか不審な点がありましたら、お手数でもご指摘願います。(コマンドプロンプトを貼り付けたものです)

1、#include <stdio.h>をはずしたときの結果
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
hello.c:
警告 W8065 hello.c 5: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

2、<string>としたときの結果
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
hello.c:
警告 W8065 hello.c 5: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

3、<math.h>としたときの結果
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
hello.c:
警告 W8065 hello.c 5: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

4、正常なソースと思われるコンパイル結果
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
hello.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

プログラムの実行結果(改行したものです)
hello
world

投稿日時 - 2007-01-04 18:19:59

ANo.12

“Borland C++ 5.5.1”をインストールし、「問題のソース」をコンパイルしました。準備したソースは、以下の2つです。

/*-----------------------*
/* test0.c */
#include<stdio.h>
intmain(void)
{
printf( "hello, C world.\n" );
return(0);
}

/*-----------------------*
/* test1.cpp */
#include<iostream>
int main()
{
std::cout << "hello, C++ world.\n" << std::endl;
return(0);
}

結果は以下のとおりです。

(1)test0.cを“bcc32 test0.c”でコンパイルし問題なし。
(2)test0.cをtest0.cppにリネームし、“bcc32 test0.cpp”でコンパイルし問題なし。
(3)test0.cをtest0.txtにリネームし、“bcc32 -Ptxt test0”でコンパイルし問題なし。
(4)test1.cppを“bcc32 test1.cpp”でコンパイルし問題なし。
(5)test1.cppをtest1.cにリネームし、“bcc32 test1.c”でコンパイルすると、「致命的エラー F1003」でダメ。

という状況でした。(5)がNGなのは妥当ですが、(2)で「問題なし」は不思議な気がします。まあ、BCCのラチチュードの広さなのでしょう。(3)は、オプションの設定が正しいことを示しています。

当然の結果といえるのですが、「ちょっと・・・」と納得できない部分もありました。解決にはならなかったかもしれませんが、私は久々にCをインストールする機会を得ましたので、お礼を申しあげます。ありがとうございました。なお、エラーを正確に質問するため、コンパイル結果をリダイレクトして貼り付けると回答しやすくなると思います。

   c:\borland\bcc55\lesson>bcc32 hello.c > err_BCC.txt

これで、エラーの内容が“err_BCC.txt”に記録されます。質問時の手間も省けますし、正確になると思います。お役に立てず、すみませんでした。

投稿日時 - 2007-01-03 16:52:44

お礼

最初の質問から、今回の質問にいたるまで、数々のアドバイスとご指摘とても感謝しています。
またソフトをダウンロードして、いろいろ確認もしていただき、本当にありがとうございます。今までのアドバイスやご指摘により、
数えられないくらい参考になりました。
今までの回答をプリントアウトして学習の参考にしています。
エラーの原因は、特定できていませんが、
1、パスの設定の不完全。
2、ソフトの操作ミス、と考えています。
改めて、BORLAND C++Compiler5.5をダウンロードし、パスの設定も、ご指摘通りやり直してみました。ソースファイルも,一つ一つ確認しながら作成してみました。
現在は、コンパイル時のエラーもなくなり、すべて問題なく解決しました。ありがとうございました。

投稿日時 - 2007-01-05 22:34:11

ANo.11

bcc32のコンパイルオプションを調べてみました。

http://hp.vector.co.jp/authors/VA003720/lpproj/special/borland/bcc32opt.htm

これによりますと、ソースのエクステンション関連は以下の4項です。

(1)-P-:拡張子が .cpp のソースは C++ として、.c のソースは c としてコンパイルする。拡張子が無指定の場合は .cpp とみなす。(デフォルト)
(2)-P すべてのソースを C++ のソースとみなす。拡張子が無指定の場合は .cpp とみなす。
(3)-Pext:すべてのソースを C++ のソースとみなす。拡張子が無指定の場合は ext とみなす。例:bcc32 -Pcxx foo bar.c baz.cpp(foo.cxx, bar.c, baz.cpp を C++ のソースとしてコンパイルする)
(4)-P-ext:拡張子が .cpp のソースは C++ として、それ以外は c としてコンパイルする。拡張子が無指定の場合は ext とみなす。

これによると、まことに不思議な現象としかいいようがありません。もっとも関係のあるのは“-P-”ですが、これは当然のことであり、おまけにデフォルト設定ですから文句のつけようがありません。だとすればソースを“foo.txt”として、明示的に(4)を用い、

  C:\>bcc32 -P-txt foo

も、Cのコンパイラとして働くはずです。情報だけを頼りに隔靴掻痒の話ばかりではどうしようもないので、明日“Borland C/C++Ver5.5”をインストールします。

投稿日時 - 2007-01-02 19:29:28

補足

度々のアドバイスありがとうございます。少し難しい所もありますが、私なりによく考えて見ます。お手数をおかけしますが、何かわかりましたら、アドバイスをお願いします。

投稿日時 - 2007-01-03 11:29:06

ANo.10

★アドバイス
・『テキスト本の手順』は完全に正しいです。
・問題は多分、コンパイラの設定で初期設定が『cpp』ファイルのコンパイルに
 なっているのでしょう。だから、『c』ファイルではエラーが出て来ると思います。
・私は、『Microsoft Visual Studio.NET 2003』という言語ソフトを使っているため
 設定方法の詳しい手順は分かりませんが、どこかのオプション設定で切り替えが
 可能だと思います。
・私の使っている言語ソフトでは、総合環境なのでプロジェクトの『プロパティ』を
 開き、『構造プロパティ』⇒『C/C++』⇒『詳細』の『コンパイル言語の選択』項目で
 『既定値』、『C コードとしてコンパイル(/Tc)』、『C++ コードとしてコンパイル(/Tp)』
 の3つが選択可能になっています。
・コマンドラインからは、『/Tc』で『c』ソースのコンパイル、『/Tp』で『cpp』ソースの
 コンパイルになります。
・『Borland』社の『C++ Compiler5.5』にも似たようなオプションはあると思います。
・また、同じかな?→試しに『c』ソースを『bcc32.exe /Tc hello.c』としてコンパイルして
 みましょう。出来たらラッキーです。原因がオプション設定だと判明するから。

最後に:
・私も『Microsoft Visual Studio.NET 2003』を使った最初に同様な経験をしました。
・そのため、プロパティからオプション設定の項目を順番に探して行きました。
・つまり、経験者なのです。→『テキスト本』に、初期設定などの詳しい設定方法などが
 書かれていたら一度は読んでみましょう。暇なときにね。
・以上。おわり。参考になりましたか?

投稿日時 - 2007-01-02 14:21:11

補足

アドバイスありがとうございます。ご指摘の「.c」を『bcc32.exe /Tc hello.c』としてコンパイルしてみたのですが、だめでした。
今は、拡張子「.cpp」でコンパイルできるので一安心です。
ただ、疑問なのは、手順3、を実行すると、エラーが発生してしまうことです。前回その内容をを書き忘れていましたが、手順3で、c:\borland\bcc55\lesson>bcc32 hello.c と入力すると、
エラー2040 hello.c 1宣言が正しく終了していない。
エラー2206 hello.c 1不正な文字'#' (0×23)と出ることです、
これは、拡張子を、「.cpp」としても発生します。今は、手順3、を飛ばしてc:\borland\bcc55\lesson>helloとすることで実行可能です。
ちなみに、ソースの拡張子が「.c」のままではコンパイルできません。otokam1947さんからの補足で、コンパイルオプションについての内容を送ってくれました。ここの所も参考にしてみ対と思います。

投稿日時 - 2007-01-03 11:20:42

ANo.9

●補足要求

↓ここから下ですよ。以下の7行をコピー&ペーストしてみて下さい。→必ず新規作成すること。
#include <stdio.h>

int main( void )
{
printf( "hello,world" );
return( 0 );
}
↑ここまで。

●その他
・これでどんなエラーがでるのか正確に結果報告して下さい。
・また、ファイル名『hello.c』を『hello.cpp』にしてコンパイルしたらどうなる?
・以上。結果報告を待っています。

投稿日時 - 2007-01-02 10:22:26

補足

回答ありがとうございます。ご指摘のとおり、プログラムをコピー&ペーストして、ファイル名拡張子を「.cpp」に変えて実行したところ、無事に「hello,world」と、表示されました。
その後、行番を入れ、拡張子を「.cpp」として確認したところ、こちらでも実行できました。
参考にしている、テキスト本では、「.cpp]の指示はどこにもありませんでした。テキスト本の手順を書きますので、何かお気づきのところがあればご指摘をお願いします。
1、コマンドプロンプトを起動する。
2、現在のディレクトリから作業ディレクトリに移動する。 c:\borland\bcc55\lesson>
3、コンパイルの実行  c:\borland\bcc55\lesson>bcc32 hello.c とする。
4、プログラムの実行
とあるのですが、3番目でいつもエラーが出ていました。
結論としては、拡張子が問題だったのですね。

投稿日時 - 2007-01-02 12:01:45

ANo.8

またまた、#2です。

そういえば、
「行番を削ってみたのですが直りませんでした。」
とあるのですが、質問のソースは「行番号:」+半角スペースになっています。このへんはいかがですか?「#」は先頭?

投稿日時 - 2007-01-02 00:51:29

補足

回答ありがとうございます。ご指摘のところの「#」は、半角で、プログラムの先頭です。
1: #include <stdio.h>です。先ほど、0h-Orangeさんからの指摘があり、どうやら、「ファイル名拡張子」に問題があったようです。今は、コンパイルを実行することができるようになりました。

投稿日時 - 2007-01-02 12:04:49

お礼

アドバイスありがとうございます。行番はつけないほうが良い結果が得られました。ご指摘のおかげで、いろいろと参考になりました。
拡張子が間違っていると思っていたのですが、「操作ミスや、パスの設定ミス、」などがあったようです。
今は、BORLAND C++Compiler5.5の再インストールや、パスの再設定などをした結果、正常になりました。

投稿日時 - 2007-01-05 22:01:29

ANo.7

ご使用中のユーザーのご意見もありましたから、心強い限りです。私もインストールしてみようか・・・という気になってきました。ファイルはCD-ROMで持っていますので、この休暇にでも遊んでみます。さて、

> 「cfg ファイル」が、「オフィス、アウトルック構成ファイル」
> という、オフィスで使うアイコンと同じなのが気になっている
> のですが、ファイルの形は関係ないのでしょうか。

これは、Windowsのファイルの関連付けでアイコンがそのようになっているものです。もちろん他の機能(挙動を含む)も関連付けられていますから、不用意にダブルクリックしたり開いたりしないことです。エディタで修正するだけなら問題ありませんし、アイコンがOfficeのようになっていても気にすることはないと思います。

さて、インストールしようという気になったのを機に、いろいろと検索してみましたら、「時代」なのでしょうか、コマンドプロンプトでの操作に関する誤解が多いのと、全角でプログラムを書いてしまうことへの注意が散見されました。意外な印象でしたが、勉強にもなりました。

投稿日時 - 2007-01-01 23:04:32

補足

回答ありがとうございます。今まで疑問だったファイル形式が問題ないということで、安心しました。
問題となっていた2件のエラーのことですが、先ほど、oh-orengeさんの指摘による、ファイル名拡張子を、「.c]から「.cpp」とすることにより解決しました。
また、テキスト本による手順
1、コマンドプロンプトを起動する。c:\documents and settings\
2、作業ディレクトリを変更する。c:\borland\bcc55\lesson>
3、コンパイルの実行、c:\borland\bcc55\lesson>bcc32 hello.c とする。
4、プログラムの実行 c:\borland\bcc55\lesson>helloとする。とあり、今までは3番の所でエラーが発生していました。ここを、ファイル名拡張子を、「.cから.cpp」に変更し、c:\borland\bcc55\lesson>helloで実行した所、無事に終了することができました。結果として。
1、ファイル名拡張子の変更と、3番を実行しないことで解決しました。テキスト本のとおり作業していたのに何かすっきりしませんがこの方法が正解なのかもしれません。この内容でお気づきの点がありましたらご指摘をお願いします。

投稿日時 - 2007-01-02 13:41:20

ANo.6

私もBorland社を使っていますが、問題なくコンパイルできました。

皆様の意見も参考にこちらも参考してください。
コマンドプロンプトで、「bcc32」とそのまま打って実行してください。

【Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
Syntax is: BCC32 [ options ] file[s] * = default; -x- = turn switch x off
-3 * 80386 Instructions -4 80486 Instructions】

のようなものが出ていればOKです。
もし出ていなければ、環境変数(パス)の設定間違いです。
こちらのソフトを使うと設定が簡単です。
http://www.cmagazine.jp/setbcc.html

投稿日時 - 2007-01-01 21:25:59

補足

回答ありがとうございます。ご指摘のとおり「bcc32」と入れてみたところ、問題なく
【Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
Syntax is: BCC32 [ options ] file[s] * = default; -x- = turn switch x off
-3 * 80386 Instructions -4 80486 Instructions】
と表示されます。
先ほど、oh-orangeさんからの指摘があり、ファイル名拡張子を、「.cpp」とした所、無事に実行できるようになりました。参考にしているテキスト本には、そのようなことが書いてなかったのですっきりしないのですが、テキスト本のプリントミスかとも思います。

投稿日時 - 2007-01-02 13:01:55

お礼

アドバイスありがとうございます。コンパイルの確認の仕方、参考になりました。拡張子の問題や、操作ミスなどが原因みたいでした。今は、「コンパイルや、ログラムの実行」など、どちらも、正常にできるようになりました。

投稿日時 - 2007-01-05 21:47:02

ANo.5

まさかの追加的な懸念です。

> 不正な文字 "#"(0×23) と出ます。

の“#”はちゃんと半角でしょうね。全角の“#”はダメです。「もしや・・・」もあると思っての追記です。というのは、(0×23)の“×”が全角で記述されていたので念のためです(間違っていたらスミマセン)。

念のためのついでにオセッカイですが、“0x23”は16進数の“23”を表し、アスキーコードで“#”を指します。“0x”には意味があります。

投稿日時 - 2007-01-01 18:47:37

ANo.4

printf関数の書式の誤りは、既にご指摘があるとおりです。修正してください。しかし、加えてエラーになっているところを注目しないと問題は解決しません。

> エラーE2040 hello.c 1:宣言が終了していない。

や、

> エラーE2206 hello.c 1:不正な文字 "#"(0×23)

です。これはbccから出力されたエラーメッセージの完全なコピーではないでしょうが、hello.cの後ろの番号は正しいと考えます。いずれも1ですが、これは、エラーを発生させている行番号ですから、このコードの場合であれば、

#include <stdio.h>

の中にエラーがあるとリポートされています。見たところ問題はなさそうですが、"#"不正な文字としているのは不思議です。“bcc32.cfg”で各プリプロセッサのある場所が仕様のとおりに指定されているでしょうか。これをご確認ください。

投稿日時 - 2007-01-01 16:38:02

補足

詳しいアドバイスありがとうございます。ご指摘の、「bcc32.cfg」と「ilink32.cfg」を確認したところ、どちらも「c:\borland\bdd55\binの「\bin」の中にありました。
各設定は、「bcpad」による自動設定と、自分での手動設定での確認でも、同じ結果になります。
一度、すべてのファイルを削除して、DLから初期設定をしなおしてみたのですが直りませんでした。また、追加でアドバイスいただいた、「#」の件ですが、もう一度よく確認してみます。
ただ、気になるのは、「cfg ファイル」が、「オフィス、アウトルック構成ファイル」という、オフィスで使うアイコンと同じなのが気になっているのですが、ファイルの形は関係ないのでしょうか。何か、気がつきましたらアドバイスをお願いします。

投稿日時 - 2007-01-01 21:20:58

ANo.3

誤 5: printf"(hello,world");
正 5: printf("hello,world");

投稿日時 - 2007-01-01 15:24:42

補足

回答ありがとうございます。手元にある、テキスト本でよく確認したら、" の位置が間違っていました。ただ、修正したのですが、直りませんでした。ほかに何か原因があるようです。

投稿日時 - 2007-01-01 20:43:58

お礼

ご指摘ありがとうございます。「"」の入れる場所を理解することができました。

投稿日時 - 2007-01-05 21:35:07

ANo.2

「1:」とか行番号表示の部分を、ソースに含めていると、質問文みたいなエラーが発生しますね。
削ってみては。もしそうならですが。

投稿日時 - 2007-01-01 14:57:09

補足

回答ありがとうございます。ご指摘のとおり、行番を削ってみたのですが直りませんでした。ほかに原因があるようです。

投稿日時 - 2007-01-01 20:41:13

お礼

アドバイスありがとうございます。いろいろ試した結果、ご指摘のとおり、行番は入れないほうが良い結果が得られました。これからは行番をつけないで、プログラミングするようにします。

投稿日時 - 2007-01-05 21:31:51

ANo.1

5: printf"(hello,world");

あきらかにここなのでは

投稿日時 - 2007-01-01 14:28:55

補足

回答ありがとうございます。手元にあるテキスト本で、よく確認したら、"の位置が間違っていました。ただ、直しても同じエラーが出てしまいます、ほかに原因があるようです。

投稿日時 - 2007-01-01 20:36:47

お礼

アドバイスありがとうございます。ご指摘のおかげで、「"」をつける本来の場所がわかるようになりました。

投稿日時 - 2007-01-05 21:26:24

あなたにオススメの質問