KEIL編譯器錯誤精心整理
阿新 • • 發佈:2019-01-19
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 ‘.’