keil MDKコンパイラの警告とエラーの詳細(不定期更新)

4715 ワード

動作後はモノリシックマシンからARMに移行する、ADS 1の使用を開始したばかりである.2コンパイラ、しばらくかかりました.私が引き継いだプロジェクトの古いプログラムはADSでコンパイルされているので、部門もほとんど使っています.単片機を習うときはkeil c 51コンパイラを使っていますが、adsとこのコンパイラは使いやすさでは比較できません.その後、keilがarm社に買収されたことが徐々に分かったが、現在keil MDKはarm公式コンパイラとなっているため、keilに再び身を投じ、普段の時間を利用して、元のプログラムをmdkで再コンパイルすることにした.mdkの利点は言うまでもありませんが、ここでは普段出会ったコンパイラからの警告やエラーメッセージを詳しく説明し、初心者に少し助けてもらい、エラーを発見し、補足する必要がある歓迎のメッセージを提供します.
 
1.warning:#550-D:variable"d"was set but never used記述:変数'd'定義は未使用、または、この変数は使用したが、コンパイラは変数dが存在する文に意味がないと判断し、コンパイラはそれを最適化した.解決:定義変数dが役に立つかどうかを注意深く測定し、変数dが存在する文に意味があると認定する場合は、volatileキーワードで変数dを修飾しようとし、本当に役に立たない場合は削除して可能なメモリを解放する.
2.warning:#1-D:last line of file ends without a newline説明:ファイルの最後の行は新しい行ではありません.コンパイラはプログラムファイルの最後の行が空行でなければならないことを要求して、長い間考えていたが、どうしてこんなことになったのか分からなかった.解决:気にしなくてもいいです.警告が出るのが嫌なら、警告が出た書類の最後の行をノックして、一行を空ける.
3.warning:#111-D:statement is unreachable説明:到達不可能を宣言する.このような場合に多く見られます.
 int main(void)
 {
       ...
       while(1)  // , 
       {
             ...
       }
       return 0; // , 
 }
解決:無視.
4.warning:C 3017 W:data may be used before being set記述:変数'data'は使用前に明確な付与がない.次のようになります.
 uint8 i,data;            // i data, 
 for ( i = 0; i < 8; i++) // 'i' 0
 {
     if ( IO1PIN & SO_CC2420 )
         data |= 0x01;    // 'data' , 
     else
         data &= ~0x01;
 }

解決:この変数の初期値が0であるかどうかを注意深く測定し、MDKコンパイラはプログラム実行前に使用するデータ領域を0に初期化するが、変数の初期値が0でない場合、この警告を無視すると致命的なエラーを引き起こす可能性があるため、この警告を無視してもよい.この警告は十分に重視されるべきだ.変数に初期値を与える習慣を身につけなければならない.
5.warning:#177-D:variable"temp"was declared but never referenced記述:変数'temp'は宣言するが引用しない.変数が宣言されているのに使用することが多く、warning:#550-D:variable"temp"was set but never usedとは異なる点はtempが使用したことがないことである.解決:定義された変数が確かに役に立たない場合は、削除します.役に立つものであれば、プログラムで使用する.この警告と同様にwarning:#177-D:function"MACProcessBeacon"was declared but never referenced
6.warning:#940-D:missing return statement at end of non-void function"DealwithInspect 2"記述:空でない関数"DealwithInspect 2"を返す最後に戻り値宣言が欠けている.次のようになります.
 int DealwithInspect2(uint32 test)
 {
      ...
      ...
      ...
     // return x; int , , 
 }

7..warning:  #1295-D: Deprecated declaration lcd_init - give arg types
説明:関数を定義するときに、関数パラメータを書くとvoid timer_などの警告が表示されます.init(); ここには形参はありません.そうすれば、コンパイラは警告します.
 
 
 
1. error:  #65: expected a ";"説明:セミコロンがありません.ほとんどは忘れ物だ解決:エラー行をダブルクリックし、エラーポイントの近くに「なし」を見つけます.番号の文にセミコロンをつける必ずしも位置決めされた誤った行にセミコロンがあるとは限らない、この行の前の行であるか、次の行であるかのいずれかである.
2. error:  #65: expected a ";"とerror:#20:identifier“xxxx”is undefinedと一緒に現れて、しかも後ろのerror:#20の間違いはたくさんの説明があるかもしれません:この間違いは初めて出会った人にとって絶対に悪夢で、間違いが現れて、希望に満ちて間違いのヒントをダブルクリックして、間違いの行に来た時驚愕して発見して、間違いの行は絶対に間違いがなくて、そこで間違いの行の前の行を探して、次の行、間違いがなくて、更に上の行を探して、下の行...コンパイルプロンプトのすべてのエラー行にエラーが発生する可能性はありません.実はこれはあなたがいるかもしれません.hファイルが外部変数または関数を宣言する場合、宣言文の最後にセミコロンが加算されません!mainのようなモジュールがたくさんあるならc,lcd.c,key.c...lcdのようなヘッダファイルがたくさんあります.h,key.h,lcd.hファイルが関数を宣言するときにプラス記号がない場合、このエラーはmainに決定される可能性があります.cでは、すべてのヘッダファイルをチェックします.解决:よくチェックする.hファイル、セミコロンを補充する.
3.  Error: L6200E: Symbol flagu multiply defined (by uart0.o and main.o).
説明:変数(シンボルでもある)flaguは複数定義(uart 0.cとmain.cで定義).通常、グローバル変数の定義が重複する.例えばmain.cでグローバル変数flaguを定義します.
      uint8 flagu=0;
uart 0.cでもこの変数が使用されるので、この変数を宣言します.私は通常、定義された変数をコピーしてから、変数の前にキーワードextern修飾を追加します.
      extern uint8 flagu=0;
次にコンパイルすると、uart 0にいるため、上記の接続エラーが発生します.cでは変数を宣言するのではなく、変数を定義します.私は変数に初期値「flagu=0」を与えたので、変数flagを繰り返し定義しました.適切な宣言方法は、付与された部分を削除することです.
      extern uint8 flagu;
解決方法:繰り返し定義された変数を見つけ、状況に応じて1箇所修正する.
4.error:#159:declaration is incompatible with previous"wr_lcd"(declared at line 40)説明:wr_lcd関数はまだ宣言されていない前に使用されています.2つのケースに多く現れます.1つ目はwr_lcd関数体はまだ書いていないので、すでにそれを使って、このような情況は1つのプログラムを書く大体の構造の中で多く現れて、ただ簡単にフレームワークを書きます.2つ目のケースは一般的で、関数aは関数bを呼び出すが、関数bの関数体は関数aの下にある.
void a(void) // a 
{
     b(); // b
}
void b(void) // b 
{
     ...
}

これにより、点コンパイルとerror:#159のエラーが発生する.関数aが関数bを呼び出すと、それまで関数bの宣言がないことが分かったからである.解決方法:関数aが関数bを呼び出す前に、関数bを宣言します.
void b(void); // b 
void a(void) // a 
{
     b(); // b
}
void b(void) // b 
{
     ...
}
 5. error:  #137: expression must be a modifiable lvalue
説明:式は変更可能な左の値でなければなりません.主にこの現象に現れます.
                 a=NUM;
NUMは数値または式であり、aは変数であるが、aはconstのような変更不可能なタイプとして定義され、NUMは変数aに値を付与できない.
解決方法:付与を放棄するか、変数の属性を変更する.
6.error:#18:expected a")"cファイルに表示されている場合は、「)」が1つ足りないか、コンパイラが認識しない文字が誤った行にあることが多い
ヘッダファイルに表示すると、エラー行が関数宣言であり、関数宣言にコンパイラが認識していない文字があることが多い.
7.error:  #7: unrecognized token
認識されていないマークは、大半が中国語の句読点に切り替えられている.