[前へ]   [目次へ]   [次へ]

エラーと警告(1)(C/C++)


   (05/01/22) 宣言している型が何故かchar型になっていたのを修正
               修正箇所2
               修正箇所3


前回とあんまりつながりがなくて申し訳ないのですが、
今回はエラーと警告について少し詳しい話を書こうと思います。
この先、ソースコードは徐々に長く、複雑になっていきます。
エラーメッセージを確実に読み取れるかどうかは、
デバッグ速度に大きな影響を与えますので・・・


さて、エラーは、コンパイラにとって解釈不能か、言語仕様に違反していることが原因で
正しく処理できないために発生します。

ただし多くのコンパイラはたとえエラーが発生してもただちにコンパイルを中止しません。
そのため最初に発生したエラーが尾を引き、山のようにエラーが出現することがあります。

尾を引きやすいエラーのひとつに、 { } ( ) 等のカッコの不対応があります。
特に { } カッコの対応が崩れると、ブロックの所属が変化してしまいます。
C/C++言語にはどのブロック中に書いてあるかで解釈が変わるものがあるので、
これらが大量にエラーと化す事があります。

{ } カッコの不対応エラーはエラーメッセージがわかりにくい上に下のほうに出る傾向があるため、
少々厄介ですが、ひとつの対策として、 { を書くと同時に } も書いてしまうという手があります。
私はこの記法をいつもしますが、不対応エラーには滅多に遭遇しません。

しかし、上記のようにエラーの実体が下のほうに出るエラーは少なく、
基本的に一番初めに示されたエラーが引き金になっている場合が大半です。

ビルド(コンパイル)はたかだか数秒〜数十秒でできるのですから、一個ずつエラーを潰していくつもりで臨んだほうが
後引き型のエラーに余計な労力を費やすこともないぶん効率がいいです。
(後引き型のエラーはその原因が消えると消滅してしまいます。本来は正しい部分ですから。)


さて、冒頭に書いた「エラーメッセージを確実に読み取る」ということについてですが、
まず言えることは、エラーメッセージはエラーの発生したソースファイル名と行数も含んでいるはずです。
そしてその行数以前にかならず原因があります。

<  1>
<  2>
<  3>
<  4>
<  5>
<  6>
<  7>
<  8>
#include <stdio.h> 

int main(void)  
{  
   
int test=10;//(1)int型の変数「test」を定義し、10で初期化 
   
printf("%d\n",test);//(2)printf関数を使って変数「test」の中身を表示 
   
return 0;  
(05/01/22)<5> 何故かtestの宣言型がcharになっていたのを修正。

これは前項で示したプログラムですが・・・
これを以下のように間違えたとします。

<  1>
<  2>
<  3>
<  4>
<  5>
<  6>
<  7>
<  8>
#include <stdio.h> 

int main(void)  
{  
   
int test=10//←;がない。  //(1)int型の変数「test」を定義し、10で初期化 
   
printf("%d\n",test);//(2)printf関数を使って変数「test」の中身を表示 
   
return 0;  
(05/01/22)<5> 何故かtestの宣言型がcharになっていたのを修正。

5行目で ; を付け忘れています。

このような場合問題があるのは5行目なのに大抵 6行目 で構文エラーと言われます。

これは5行目の時点ではまだエラーになっていないことを意味します。
前にも書きましたがC/C++は基本的には空白や改行を読み飛ばすため、
たとえば次の行の最初に ; があれば問題はないわけであり、
コンパイラは単に1行がソース上で2行に分けられているだけと期待しています。
実際に1行が長くなった場合はソース上で複数行に分けて書くケースもあります。
つまり、この場合はコンパイラは次のような1行として解釈しようとします。
(注釈も読み飛ばされるので省略します)

int test=10 printf("%d\n",test);

(05/01/22)何故かtestの宣言型がcharになっていたのを修正。

しかし10の次に printf を続けることはできません。
ここで初めてエラーが報告されます。
printf があるのは6行目なので6行目で構文エラーが出るというわけです。


このようにエラーが報告された行に必ず問題があるとは限らないことに注意してください。
報告された行の数行前も疑わないと、原因が見つからないケースも少なくありません。


次回も引き続きエラーと警告について書く予定です。

[前へ]   [目次へ]   [次へ]

プログラミング講座 総合目次

最終更新 2008/10/17