• ベストアンサー

C言語ソースのコンパイルについて

C言語ソースファイルのコンパイルを実施しています。以前はコンパイルできていたのに、環境を変更したらコンパイルできなくなりました。原因や解決方法をお教え下さい。 旧環境 OS:WindowsNT VC:5.0 新環境 OS:Windows2000 VC:6.0 現象 HSTMTの宣言が出来ない? エラーメッセージ ・・・\TEST.c(683) : warning C4700: 値が割り当てられていないローカルな変数 'hstmt' に対して参照が行われました。 状況 変数 'hstmt'はHSTMTとして宣言しています。 よろしくお願いいたします。

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

  • ベストアンサー
回答No.3

みなさん,ご指摘の通りなのですが, 「環境を変更したら...」 というのがどのような変更なのかにもよりますが, ご質問のエラーメッセージから判断すると, 変数を初期化せずに参照したと言うことです. 変数は,初期化(値の代入)せずに参照してはいけないことになっています. なぜならば,初期化しないと,その変数にどんな値が入っているのか分からないからです. BASICですと,変数は使用するときに必ずゼロに初期化されますので,このような心配はありません. しかし,Cなどのスピード重視の言語では,指定されていない余計なことはしないのがスタイルなのです. 「宣言」することと,「初期化」することは,別のものです. int a; a=0; または, int a=0; と書けば,宣言して,初期化できます. 中には,変数の初期値など関係ないプログラムもアルでしょうから,このエラーチェックは,必須ではありません. よって,ワーニングレベルで動作するプログラムもたくさんあります. しかし,プログラムの基本的な考え方に立てば,「間違い」と言えます.C++は,初期化する専用関数をコンストラクタといって「当然」のように用意します. (必須ではないのかもしれません.) エラーチェックのレベルも,コンパイラオプションの設定でも変わります. 一度,ご確認を.

momo_right
質問者

お礼

回答ありがとうございました。 ご指摘の通り、初期化忘れでした。 現行で問題なかったので、そのままチェックもせずにコンパイルしたのがまずかったです。 ありがとうございました。

その他の回答 (2)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>・・・\TEST.c(683) : warning C4700: 値が割り当てられていないローカルな変数 'hstmt' に対して参照が行われました 値の代入が一度も行われていない変数の内容を使用しています。 というワーニングです。C言語のソースとしてだめなのはわかりますよね? ということで、最初からバグもちだったということです。 これって、VC5でもリリースビルドなら出た気がしますけど。

momo_right
質問者

お礼

回答ありがとうございました。 初期化していませんでした。現行では問題なくコンパイルできていたので油断していました。 ありがとうございました。 VC5.0だと、初期化していないと、エラーが出たり出なかったりでまちまちでした。

  • ponnta
  • ベストアンサー率17% (31/179)
回答No.1

エラーの内容を見た感じでは、 hstmtに値を入れることなくいきなりリードしているんじゃないかな? ローカル変数はスタックに作られるため、格納されている値が不定ですからね・・・

momo_right
質問者

お礼

回答ありがとうございました。 初期化を入れたら正常終了しました。 旧環境では初期化していなくとも正常終了していたので油断してしまいました。 ありがとうございました。