MDK4編譯過程中出現的錯誤以及警告解釋

在做數據處理的時候,出現warning: #223-D: function "abs" declared implicitly

添加:float abs(float __x);//防止abs warning, 原因不明確, 可能是math.h與stdlib.h中都有abs()吧,用stdlib.h替換math.h也可解決問題

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: C3017W: 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 "DealwithInspect2"
描述:返回非空的函數"DealwithInspect2"的最後缺少返回值聲明.如:
int DealwithInspect2(uint32 test)
{
...
...
...
//此處應該是return x;返回一個int型數據,若是沒有返回值,編譯器產生警告
}

7.

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多處定義(在uart0.c中和main.c都定義了).通常錯在全局變量定義重複.比如:在main.c中定義全局變量flagu:

uint8 flagu=0;

在uart0.c中也用到該變量,於是聲明此變量,我通常都是先複製定義的變量再在變量前面加關鍵字extern修飾:

extern uint8 flagu=0;

然後編譯,就會出現上面的連接錯誤,原因在於,我在uart0.c中是又定義了一個變量,而不是聲明變量,因爲我給變量賦了初值"flagu=0",這樣就重複定義了變量flag.正確的聲明方法是去掉賦值部分:

extern uint8 flagu;

解決辦法:找到重複定義的變量,看情況修改一處.

4.error: #159: declaration is incompatible with previous "wr_lcd" (declared at line 40)
描述:在wr_lcd函數還沒有聲明之前就已經使用了.多出現在兩種情況:第一種,wr_lcd函數體還沒有寫,就已經用到了它,這種情況多出現在寫一個程序的大體結構中,只是簡單寫一下框架.第二種情況比較常見,函數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的實體
{
...
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章