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)
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
解決:應仔細衡量該變數的初始值是否為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)
7..warning: #1295-d: deprecated declaration lcd_init - give arg types
描述:在定義函式的時候,如果你寫上函式引數,就會有這個警告,比如void timer_init(); 這裡就沒有形參,如果這樣的話,編譯器會給出警告.
1. error: #65: expected a ";"
描述:缺少分號.大多是漏忘';'.
解決:雙擊錯誤行,在定位到錯誤點的附近找到沒加';'號的語句,加上分號.並不一定在定位到的錯誤行才卻分號,可能是這行的上一行,也可能是下一行.
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的實體
void b(void) //函式b的實體
這樣如果點編譯,就會產生error: #159的錯誤,因為當函式a呼叫函式b時,發現在這之前都沒有函式b的任何宣告.
解決方法:在函式a呼叫函式b之前,對函式b進行宣告,如:
void b(void); //對函式b進行宣告
void a(void) //函式a的實體
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檔案中, 多半是因為少了乙個")",或者錯誤行有編譯器不識別的字元
如果出現在標頭檔案中,錯誤行又是乙個函式宣告,多半是因為在函式宣告中有編譯器不認識的字元.
7.error: #7: unrecognized token
未識別的標記,多半是切換成了中文標點。
來自《
keil MDK編譯器警告和錯誤詳解
1.warning 550 d variable d was set but never used 描述 變數 d 定義但從未使用,或者是,雖然這個變數你使用了,但編譯器認為變數d所在的語句沒有意義,編譯器把它優化了.解決 仔細衡量所定義的變數d是否有用,若是認定變數d所在語句有意義,那麼嘗試用vo...
編譯器警告和錯誤詳解
原文 1.warning 550 d variable d was set but never used 描述 變數 d 定義但從未使用,或者是,雖然這個變數你使用了,但編譯器認為變數d所在的語句沒有意義,編譯器把它優化了.解決 仔細衡量所定義的變數d是否有用,若是認定變數d所在語句有意義,那麼嘗試...
keil mdk編譯器學習筆記(1) 序
這兩天,學習了keil mdk編譯器的特性,這基本上獨立於c語言語法,平時基本上都在強調c語言的學習,但是編譯器的學習我們也要注重,類似於gcc一樣,不也有很多網上的資料,講述gcc的特性和用法嗎。作為嵌入式開發,keil mdk的特性也是要了解到,另外,iar編譯器也是有其特有的程式設計技巧的,因...