1. 程式人生 > >KEIL編譯器錯誤精心整理

KEIL編譯器錯誤精心整理

C51編譯器識別錯型別有三種 1、致命錯誤:偽指令控制行有錯,訪問不存在的原檔案或標頭檔案等。 2、語法及語義錯誤:語法和語義錯誤都發生在原檔案中。有這類錯誤時,給出 提示但不產生目標檔案,錯誤超過一定數量才終止編譯。 3、警告:警告出現並不影響目標檔案的產生,但執行時有可能發生問題。程式 員應斟酌處理。 D.1 致命錯誤 C_51 FATAL_ERROR ACTION: <當前行為> LINE: <錯誤所在行> ERROR: <錯誤資訊> terminated 或C_51 FATAL ERROR ACTION: <當前行為> FILE: <錯誤所在檔案> ERROR: <錯誤資訊> terminated C_51 TERMINATED C_51 (1) ACTION 的有關資訊 *PARSING INVOKE-/#PRAGMA_LINE 在對#pragma 指明的控制行作此法分析時出錯。 *ALLOCATING MEMORY 系統分配儲存空間時出錯。編譯較大程式需要512k空間。 *OPENING INPUT_FILE 開啟檔案時,未找到或打不開原始檔/標頭檔案。 *CREATE LIST_FILE/OBJECT_FILE/WORK_FILE 不能建立上述檔案。可能磁碟滿或檔案已存在而且防寫。 *PARSING SOURCE_FILE/ANALYZING DECLARATIONS 分析源程式時發現外部引用名太多。 *GENERATING INTERMEDIATE CODE 原始碼被翻譯成內部虛擬碼,錯誤可能來源於函式太大而超過內部極限。 *WRITING TO FILE 在向檔案(work,list,prelist或object file)寫時發生錯誤。 (2)ERROR的有關資訊 *MEMORY SPACE EXHAUSTED 所有可用系統空間耗盡。至少需要512k 位元組空間。沒有足夠空間,使用者必須檢查常駐記憶體 的驅動程式是否太多。 *FILE DOES NOT EXIST FILE 行定的文字檔名未發現。 *CAN’T CREAT FILE FILE 行定義的檔案不能被建立。 *SOURCE MUST COME FROMA DISK_FILE 原始檔和標頭檔案必須存在於硬碟或軟盤上。控制檯、CON、CI 或類似裝置不允許作為輸入 檔案。 *MORE THAN 256 SEGMENTS/PUBLICS/EXTERNALS 受OMF_51的歷史限制,一個源程式不能超過256個各種函式的型別段,256個全域性變數, 256 個公共定義或外部引用名。不使用為變數可以減少使用的段數。使用static 儲存型別說 明符可減少全域性變數的使用數目。合理調整定義性說明的位置可減少外部引用名的使用數 目。 *FILEWRITE ERROR 當向list、prelist、work或object檔案中寫內容時,由於空間不夠而發生錯誤。 *NON_NULLARGUMENT EXPECTED 所選的控制引數需要一個括號內的變數,如一個資料夾或一個數。 *“(”AFTER CONTROL EXPECTED 變數的左括號丟失。 *“)”AFTER PARAMETER EXPECTED 變數的右括號丟失。 *RESPECIFIED OR CONFLICTING CONTROL 所選的控制引數與前面發生衝突或重複,例如CODE和NOCOND *BAD DECIMAL NUMBER 控制引數的數字含有非法數,需要使用十進位制數。 *OUT OF RANGE DECIMAL NUMBER 控制引數的數字越界,例如OPTIMIZE 的參量為0-5。 *IDENTIFIER EXPECTED 控制引數DEFINE 需要一個識別符號做參量,與C語言的規則相同。 *PARSE STACK OVERFLOW 分析棧溢位。可能是源程式包含特別複雜的表示式,或功能塊巢狀數超過15。 *PREPOCESSOR: MACRO TO NESTED 巨集擴充套件期間,前處理器的棧耗用太大。表明巨集巢狀太多,或有遞迴巨集定義。 *PREPOCESSOR: LINE TOO LONG(510) 巨集擴充套件後行超過510個字元。 *CAN’T HAVE GENERAL CONTROL IN INVOCATION LINE 一般控制(如EJECT)不能是命令列的一部分,應將它們放入原始檔“pragma”預處理行 中。 D.2 語法及語義錯誤 D.2.1 錯誤格式 這類錯誤在列表檔案中產生如下格式的資訊: ***ERROR<number>IN LINE<line>OF<file>:error message ***WARING<number>IN LINE<line>OF<file>:warning message <number>表示錯誤行; <line>表示原始檔或標頭檔案中與錯誤或警告相關的行; <file>指明瞭錯誤所在的原始檔或標頭檔案; D.2.2 錯誤資訊及可能發生的原因 *ERROR100:unprintable character 0x??skipped 原始檔中發現非法字元(注意,註解內的字元不做檢查)。 *ERROR101:unclosed string 串未用引號結尾。 *ERROR 102:string too long 串不得超過511 個字元。為了定義更長的串,使用者必須使用續行符‘\’邏輯的繼續該串, 在詞彙分析時遇到以該符號結尾的行會與下行連線起來。 *ERROR 103: invalid character constant 試圖再宣告一個已定義的巨集,已存在的巨集可以用#undef指令刪除。預定義的巨集不能刪除。 *ERROR 104: identifier expected 前處理器指令期望產生一個標示符,如ifdef<name>。 *ERROR 105: unclosed comment 當註解無結束界定符(*/)時產生此錯誤。 *EROOR 106: unbalanced#if-endif controls endif的數量與if或ifdef的數量不匹配。 *ERROR 107:include file nesting exceeds 9 include指令後的檔名無效或丟失 *ERROR 108: expected string,如#error “string” 前處理器指令期望一個串變數。 *ERROR 109:<user error text> 由#error 偽指令引入的錯誤資訊以錯誤訊號形式顯示。 *ERROR 110:missing directive 預處理行#後缺少偽指令。 *ERROR 111:unknown directive 預處理行#後不是偽指令。 *ERROR 112:misplaced ‘elif’ *ERROR 113:misplaced ‘else’ *ERROR 114:misplaced ‘endif’ 指令 elif/else/endif 只有在if、ifdef、ifndef指令內才是合法的。 *ERROR 117:bad integer expression if/elif指令的數值表示式有語法錯誤。 *ERROR 118:missing’(‘after macro identifier 巨集呼叫中實參表的左括號丟失 *ERROR 119:reuse of macro formal parameter 巨集定義形參名重複使用 *ERROR 120:‘C’unexpected in formal list 形參表中不允許有字元‘c’,應用逗號代替 *ERROR 121:missing ‘)’after actual parameter 巨集呼叫實參表的右括號丟失 *ERROR 122:illegal macro invocation 巨集呼叫的實參表與巨集定義中的形參表不同 *ERROR 123:missing macro name after ‘define’ #define 偽指令後缺預定義的巨集 *ERROR 124:expected macro formal parameter 巨集定義要求形參名 *ERROR 125:declarater too complex 說明過於複雜 *ERROR 126:type-stack underflow 物件的宣告至多隻能包含20 個型別修飾符(【】,*,(),)錯誤126 經常在錯誤125 之前, 兩者一起發生。 *ERROR 127:invalid storage class 物件用無效的儲存類所說明。當在函式外用auto/register 儲存時會發生這種情況。 *ERROR 128:memory space: illegal memory space ‘memory space ’used 函式引數的儲存類由儲存模式(SMALL LARGE COMPACT)決定使用者不能改變,使用不同 於儲存模式的自動變數應該為靜態的儲存類 *ERROR 129:missing’ ;’before ‘token’ 該錯誤表示分號丟失,通常該錯誤會引發一連串的錯誤,引發的這些錯誤無關緊要。因為缺 少分號後編譯器不能做正確的語法分析 *ERROR 130:value out of range using 或interrupt 指令後引數越限。using 用的暫存器組號位0-3,interrupt 需要0-15 的中 斷號 *ERROR 131:duplicate function-parameter 函式中形參名重複,形參名應彼此不同 *ERROR 132:not in formal parameter list 函式內參數宣告使用的名字未出現在引數表中 *ERROR 133:char function(v0,v1,v2) Char*v0,*v1,*v5;/ *’v5’在形參中未出現 *ERROR 134:xdata/idata/pdata/data on function not permitted 函式總是駐留於0x5xxxx 的code儲存區,不能位於xdata/idata/pdata/data 空間 *ERROR 135:bad storage class for bit 位變數的定義可以接受static或extern的儲存類,用REGIESTER和ALIEN 都是非法的 *ERROR 136:‘void’on variable ‘void’型別只允許作為函式的返回型別或與指標型別合用(void*) *ERROR 137:illegal parameter type:’function’ 函式引數的型別不能是函式,然而函式指標可以作為引數 *ERROR 138:interrupt ()may not receive or return value (s) 中斷函式既不能有引數又不能有返回值 *ERROR 139:illegal use of ‘alien’ 關鍵字alien 將函式定義為PL/M51 規定的過程與函式結構。這意味著C函式中有引數的縮 記符號(即funct(…);)時是不能用alien的 *ERROR 140:bit in illegal memory-space 位變數的定義可包含修飾符DATA,如果無修飾符則假定為DATA。因為位變數始終位於 0x4xxx 的內部資料儲存器中,當試圖採用其他儲存空間就會產生這個錯誤。 *ERROR 141:NEAR<token>:expected<token> 編譯器所見的單詞是錯誤的。期望正確的單詞 *ERROR 142:invalid base address Sfr 說明中的基址有錯。有效基址為0x80-0xff。如果宣告採用base^pos 形式,則基址是8的 整數倍 *ERROR 143:invalid absolute bit position Sbit 說明中位地址必須在0x80-0xff之間 *ERROR 144:base^pos:invalid bit position Sbit 說明中位pos必須在0~7之間 *ERROR 145:undeclared sfr Sfr 未說明 *ERROR 146:invalid sfr 絕對位地址說明(base^pos)包含無效的基地址。這個基地址必須與sfr 名相對應 *ERROR 147:object too large 物件不能超過65536(64k)位元組 *ERROR 148:field not permitted in union 聯合不能包含位成員,這個限制是由8051結構決定的。 *ERROR 149:function member in struct/union 結構或者聯合不能包含函式型別的成員。但是指向函式的指標是允許的 *ERROR 150:bit member in struct/union 結構或者聯合不能包含位型別的成員,這個限制是由8051 結構決定的 *ERROR 151:self relative struct/union 結構或者聯合不能包含自身 *ERROR 152:bit field type too small for number of bits 位域宣告中指定的位數超過所給原型中位的數量 *ERROR 153:named bit-field cannot have 0 width 命名的域寬度為0 錯誤,只有未命名的位域允許是0寬度 *ERROR 154:pro to field 無指向位域指標的型別 *ERROR 155:char/int required for fields 位域基型別要求char 或int型別,unsigned char 或unsigned int 也有效 *ERROR 156:alien permitted on function only Alien 只能用於函式 *ERROR 157:var_parms on alien function 有變引數的函式不能用alien ,因為PL/M51函式只能用固定數量的引數 *ERROR 158:function contains unnamed parameter 函式定義的引數表中包含無名引數。無名引數只允許用於函式的原型中 *ERROR 159:type follows void 函式原型宣告中可含一個空的引數表f(void)。Void後不能再用其他型別定義 *ERROR 160:void invalid Void型別只能與指標合用或表明函式沒有返回值 *ERROR 161:formal parameter ignored 函式內的外部函式引用宣告使用了無型別的引數表。例如“ extern(a,b,c);”要求形參表 *ERROR 162:duplicate function-parameter 函式內參數名重複 *ERROR 163:unknown array size 一般的不管是一維陣列還是多維陣列或外部陣列,都需要指定陣列的大小,這個大小是由編 譯器的初始化時計算,這個錯誤表明試圖為一個未定維的陣列使用sizeof運算子,會哦著一 個多維陣列的附加元素未定義。 *ERROR 164:ptr to null 這一個錯誤通常是由前一個錯誤造成的 *ERROR 165:ptr to bit 指向位的指標不是合法的型別 *ERROR 166:array of function 陣列不能包含函式,但可能包含指向函式的指標。 *ERROR 167:array of fields 位域不能安排為陣列 *ERROR 168:array of bit 陣列沒有位型別 *ERROR 169:function returns function 函式不能返回函式,但可以返回一個指向函式的指標 *ERROR 170:function returns array 函式不能返回陣列,但可返回指向陣列的指標 *ERROR 171:missing enclosing swith Break/continue 語句只能出現在for,while,do while或switch語句中間。 *ERROR 172:missing enclosing swith Case語句只能用在switch語句中 *ERROR 173:missing return-expression 返回型別不是integer 的函式必須包含一條代表達式的return 語句。由於要與老版本相容, 編譯器對返回整形值的函式不做檢查 *ERROR 174:return-expression on void-function Void 函式不能返回值,因此不能包含帶表示式return的語句 *ERROR 175:duplicate case value 每個case 語句必須包含一個常量表達式做其變數,這個值不能在switch 語句的各級中出現 多次 *ERROR 176:more than one default Switch語句中不能包含多於一個的default語句 *ERROR 177:different struct/union 賦值或引數傳遞中使用了結構/聯合的不同型別 *ERROR 178:struct/union comparison illegal 根據ANSI C,兩個結構或聯合的比較是不允許的 *ERROR 179:cannot/cast from/to void-type 將void型別轉化為其他型別資料或將其他型別轉化為void型別都是非法的 *ERROR 180:cannot cast to’function’ 轉化為function是非法的,使用函式指標指向不同的函式 *ERROR 181:incompatible operand 在所給的運算子中至少有一個操作符型別是無效的 *ERROR 182:point to different object 報告指標使用不一致 *ERROR 183:unmodifiable value 預修改的物件位於CODE 儲存區,因而不能修改 *ERROR 184:sizeof :illegal operand Sizeof運算子不能決定函式或位域大小 *ERROR 185:different memory space 物件說明的儲存空間與前面的不一致 *ERROR 186:invalid dereference 這條錯誤資訊可能由編譯器內部問題產生的 *ERROR 187:not an lvalue 所需參量必須是可變物件的地址 *ERROR 188:unknown object size 無法計算物件的大小,因為缺少陣列的維數或因為通過void指標的間接訪問 *ERROR 189:‘&’on bit/sfr illegal 地址操作符‘&’不允許用於位物件或sfr *ERROR 190:’&’:not an lvalue 地質部是可變的物件,不能作為左值 *ERROR 191:‘&’on constant 試圖為所列型別常數建立指標 *ERROR 192:‘&’on array/function 地址操作符&不允許用於陣列或函式,函式和陣列本身都代表了地址 *ERROR 193:illegal op-type(s) *ERROR 193:illegal add/sub on ptr *ERROR 193:illegal operation on bit(s) *ERROR 193:bad operand type 當一個表示式使用給定運算子的非法操作型別時就會出現該錯誤,使用個定運算子的非法操 作型別的無效的表示式,例如bit+bit,ptr+ptr,或ptr*<any>。錯誤資訊包括引起錯誤的運算子。 下列運算可使用位操作符 賦值(=) OR/複合OR(|,|=) AND/複合AND(&,&=) XOR/複合XOR(^,^=) 位或常數的安位比較(= =,!=) 取反(~) *ERROR 194:’*’indirection to object of unknown size 間接操作符*不能用於void指標(void*),因為指標所指的物件的大小時未知的 *ERROR 195:’*’illegal indirection 間接操作符*不能用於非指標變數 *ERROR 196:mspace probably invalid 產生此警告是因為某些常數值賦給指標並且常數沒有形成一個有效的指標值,有效的指標常 數型別為long/unsigned long。編譯器對指標物件採用24bit(3 位元組),低16 位表示偏移,高 8 位表示儲存類的選擇,在低位元組中,值從1 到5 表明了xdata/pdata/idata/data/和code 的存 儲類 *ERROR 197:illegal pointer assignment 試圖將一個非法變數賦給指標,只有另一個指標或指標變數可以賦給指標 *ERROR 198:size of returns zero 求某些物件長度得到0,如果物件是外部的或一個數組中並非所有維的大小都是已知時得到 0,這時候該值可能是錯的。 *ERROR 199:left size of’->’requires struct/union pointer ->操作符的左邊變數必須是結構或變數 *ERROR 200:left size of ‘.’