致命錯誤
致命錯誤立即終止編譯這些錯誤通常是命令行指定的無效選項的結(jié)果當(dāng)編譯器不
能訪問一個特定的源包含文件時也產(chǎn)生致命錯誤
致命錯誤信息采用下面的格式
C51 FATAL-ERROR –
ACTION :
LINE:
ERROR:
C51 TERMIANTED.
C51 FATAL-ERROR –
ACTION:
FILE:
ERROR:
C51 TERMIANTED.
下面說明Action和Error中可能的內(nèi)容
Actions
ALLOCATING MEMORY
編譯器不能分配足夠的存儲區(qū)來編譯指定的源文件.
CREATING LIST-FILE/OBJECT-FILE/WORKFILE
編譯器不能建立列表文件,OBJ文件,或工作文件這個錯誤的出現(xiàn)可能是磁盤
滿或?qū)懕Wo(hù),或文件已存在和只讀.
GENERATING INTERMEDIATE CODE
源文件包含的一個函數(shù)太大,不能被編譯器編譯成虛擬代碼.嘗試把函數(shù)分小或
重新編譯.
OPENING INPUT-FILE
編譯器不能發(fā)現(xiàn)或打開所選的源或包含文件.
PARSING INVOKE-/#PRAGMA-LINE
當(dāng)在命令行檢測到參數(shù)計算,或在一個#pragma中檢測到參數(shù)計算,就產(chǎn)生這樣
的錯誤.
PARSING SOURCE-FILE / ANALYZING DECLARATIONS
源文件包含太多的外部參考.減少源文件訪問的外部變量和函數(shù)的數(shù)目.
WRITING TO FILE
當(dāng)寫入列表文件,OBJ文件,或工作文件時遇到的錯誤.
Errors
‘(‘ AFTER CONTROL EXPECTED
一些控制參數(shù)需要用括號包含一個參數(shù).當(dāng)沒有左括號時顯示本信息.
‘)’ AFTER PARAMETER EXPECTED
本信息表示包含沒有參數(shù)的右括號.
BAD DIGIT IN NUMBER
一個控制參數(shù)的數(shù)字參數(shù)包含無效字符.只能是十進(jìn)制數(shù).
CAN’T CREATE FILE
在FILE行定義的文件名不能建立.
CAN’T HAVE GERERAL CONTROL IN INVOCATION LINE
一般控制(例如EJECT)不能包含在命令行.把這些控制用#pragma聲明放在
源文件中.
FILE DOES NOT EXIST
沒有發(fā)現(xiàn)定義在FILE行的文件.
FILE WRITE-ERROR
因為磁盤空間不夠,寫到列表,預(yù)打印,工作,或目標(biāo)文件時出錯.
IDENTIFIER EXPECTED
當(dāng)DEFINE控制沒有參數(shù)時產(chǎn)生本信息.DEFINE要求一個參數(shù)作為標(biāo)識符.這
和C語言的規(guī)則相同.
MEMORY SPACE EXHAUSTED
編譯器不能分配足夠的存儲區(qū)來編譯指定的源文件.如果始終出現(xiàn)這個信息,應(yīng)
該把源文件分成兩個或多個小文件再重新編譯.
MORE THAN 100 ERRORS IN SOURCE-FILE
在編譯時檢測到的錯誤超過100個.這使編譯器終止.
MORE THAN 256 SEGMENTS/EXTERNALS
在一個源文件中的參考超過256.個單個的源文件不能有超過256個函數(shù)或外部參
考.這是INTEL目標(biāo)模塊格式(OMF-51)的歷史的限制.包含標(biāo)量和/或bit聲明
的函數(shù)在OBJ文件中生成兩個,有時候三個段定義
NON-NULL ARGUMENT EXPECTED
所選的控制參數(shù)需要用括號包含一個參數(shù)(例如,一個文件名或一個數(shù)字)
OUT OF RANGE NUMBER
一個控制參數(shù)的數(shù)字參數(shù)超出范圍.例如OPTIMIZE控制只允許數(shù)字0到6,值
7就將產(chǎn)生本錯誤信息.
PARSE STACK OVERFLOW
解析堆棧溢出.如果源程序包含很復(fù)雜的表達(dá)式或如果塊的嵌套深度超過31級,
就會出現(xiàn)這個錯誤
PREPROCESSOR: LINE TOO LONG( 32K)
一個中間擴展長度超過32K字符.
PREPROCESSOR: MACROS TOO NESTED
在宏擴展期間,預(yù)處理器所用的堆棧太大.這個信息通常表示一個遞歸的宏定義,
但也可表示一個宏嵌套太多.
RESPECIFIED OR CONFLICTING CONTROL
一個命令行參數(shù)指定了兩次,或命令行參數(shù)沖突.
SOURCE MUST COME FROM A DISK-FILE
源和包含文件必須存在.控制臺CON;,; CI;,或類似的設(shè)備不能作為輸入文件.
UNKNOWN CONTROL
所選的控制參數(shù)不認(rèn)識.
語法和語義錯誤
語法和語義錯誤一般出現(xiàn)在源程序中.它們確定實際的編程錯誤.當(dāng)遇到這些錯誤時,
編譯器嘗試?yán)@過錯誤繼續(xù)處理源文件.當(dāng)遇到更多的錯誤時,編譯器輸出另外的錯誤,
信息但是不產(chǎn)生OBJ文件.
語法和語義錯誤在列表文件中生成一條信息這些錯誤信息用下面的格式
*** ERRORnumberIN LINElineOFfile:error message
這里
number錯誤號
line對應(yīng)源文件或包含文件的行號
file產(chǎn)生錯誤的源或包含文件名
error message對錯誤的敘述說明
下表按錯誤號列出了語法和語義錯誤錯誤信息列出了主要說明和可能的原因和改正
號錯誤信息和說明
100跳過不可打印字符0x??
在源文件中發(fā)現(xiàn)一個非法字符.(注意不檢查注釋中的字符)
101字符串沒結(jié)束
一個字符串沒有用雙引號終止.
102字符串太長
一個字符串不能超過4096個字符用串聯(lián)符號在邏輯上可延長字符串
超過4096個字符這個模式的行終止符在詞匯分析時是連續(xù)的
103無效的字符常數(shù)
一個字符常數(shù)的格式無效符號c是無效的除非c是任何可打印的ASCII
字符
125聲明符太復(fù)雜20
一個目標(biāo)的聲明可包含最多20個類型修飾符[ ] *這
個錯誤經(jīng)常伴隨著錯誤126
126類型堆棧下溢
類型聲明堆棧下溢這個錯誤通常死錯誤125的副產(chǎn)品
127無效存儲類
一個目標(biāo)用一個無效的存儲空間標(biāo)識符聲明如果一個目標(biāo)在一個函數(shù)外用存
儲類auto或register聲明就會產(chǎn)生本錯誤
129在標(biāo)記前缺少
本錯誤通常表示前一行缺少分號當(dāng)出現(xiàn)本錯誤時編譯器會產(chǎn)生很多錯誤信
息
130值超出范圍
在一個using或interrupt標(biāo)識符后的數(shù)字參數(shù)是無效的using標(biāo)識符要求一個0
到3之間的寄存器組號interrupt標(biāo)識符要求一個0到31之間的中斷矢量號
131函數(shù)參數(shù)重復(fù)
一個函數(shù)有相同的參數(shù)名在函數(shù)聲明中參數(shù)名必須是唯一的
132沒在正式的參數(shù)列表
一個函數(shù)的參數(shù)聲明用了一個名稱沒在參數(shù)名列表中例如
char function(v0,v1,v2)
char *v0,*v1,*v5;
/* ‘v5’沒在正式列表中*/
{
/* … */
}
134函數(shù)的xdata/idata/pdata/data不允許
函數(shù)通常位于code存儲區(qū)不能在別的存儲區(qū)運行函數(shù)默認(rèn)定義為存儲類型
code
135 bit的存儲類錯
bit標(biāo)量的聲明可能包含一個static或extern存儲類register或alien類是無效的
136變量用了void
void類型只允許作為一個不存在的返回值或一個函數(shù)的空參數(shù)列表void
func(void)或和一個指針組合void *
138 Interrupt()不能接受或返回值
一個中斷函數(shù)被定義了一個或多個正式的參數(shù)或一個返回值中斷函數(shù)不能
包含調(diào)用參數(shù)或返回值
140位在非法的存儲空間
bit標(biāo)量的定義可以包含可選的存儲類型data如果沒有存儲類型則默認(rèn)為
data因為位通常在內(nèi)部數(shù)據(jù)存儲區(qū)當(dāng)試圖對一個bit標(biāo)量定義別的數(shù)據(jù)類型
時會產(chǎn)生本錯誤
141臨近標(biāo)志語法錯誤期待別的標(biāo)志…
編譯器所見的標(biāo)志是錯誤的參考所顯示的期待的內(nèi)容
142無效的基地址
一個sfr或sbit聲明的基地址是錯誤的有效的基地址范圍在0x80到0xFF之間
如果用符號基地址^位號聲明則基地址必須是8的倍數(shù)
143無效的絕對位地址
sbit聲明中的絕對位地址必須在0x80到0xFF之間
144基地址^位號無效的位號
sbit聲明中定義的位號必須在0到7之間
145未知的sfr
146無效sfr
一個絕對位基地址^位號的聲明包含一個無效的基地址標(biāo)識符基地址必
須是已經(jīng)聲明的sfr任何別的名稱是無效的
147目標(biāo)文件太大
單個目標(biāo)文件不能超過65535 64K字節(jié)-1
149 struct/union包含函數(shù)成員
struct或union不能包含一個函數(shù)類型的成員但是指向函數(shù)的指針是可以的
150 struct/union包含一個bit成員
一個union不能包含bit類型成員這是8051的結(jié)構(gòu)決定的
151 struct/union自我關(guān)聯(lián)
一個結(jié)構(gòu)不能包含自己
152位號超出位域
位域聲明中指定的位號超過給定基類的位號
153命名的位域不能為零
命名的位域為零只要未命名的位域允許為零
154位域指針
指向位域的指針不允許
155位域要求char/int
位域的基類要求char或int unsigned char和unsigned int類型也行
156 alien只允許對函數(shù)
157 alien函數(shù)帶可變參數(shù)
存儲類alien只對外部PL/M-51函數(shù)允許符號char *,…在alien函數(shù)中是非
法的PL/M-51函數(shù)通常要求一個固定的參數(shù)表
158函數(shù)包含未命名的參數(shù)
一個函數(shù)的參數(shù)列表定義包含一個未命名的抽象類型定義這個符號只允許在
函數(shù)原型中
159 void后面帶類型
函數(shù)的原型聲明可包含一個空參數(shù)列表例如int func(void)在void后不
能再有類型定義
160 void無效
void類型只在和指針組合或作為一個函數(shù)的不存在的返回值中是合法的
161忽視了正式參數(shù)
在一個函數(shù)內(nèi)一個外部函數(shù)的聲明用了一個沒有類型標(biāo)識符的參數(shù)名列表例
如extern yylex(a,b,c);
180不能指向一個函數(shù)
指向一個函數(shù)的類型是無效的嘗試用指針指向一個函數(shù)
181操作數(shù)不兼容
對給定的操作符至少一個操作數(shù)類型是無效的例如~float_type
183左值不能修改
要修改的目標(biāo)位于code存儲區(qū)或有const屬性因此不能修改
184 sizeof非法操作數(shù)
sizeof操作符不能確定一個函數(shù)或位域的大小
185不同的存儲空間
一個目標(biāo)聲明的存儲空間和前一個同樣目標(biāo)聲明的存儲空間不同
186解除參照無效
一個內(nèi)部編譯器問題會產(chǎn)生本信息如果本錯誤重復(fù)出現(xiàn)請和技術(shù)支持接洽
187不是一個左值
所需的參數(shù)必須是一個可修改的目標(biāo)地址
188未知目標(biāo)大小
因為沒有一個數(shù)組的維數(shù)或間接通過一個void指針一個目標(biāo)的大小不能計
算
189 &對bit/sfr非法
取地址符’&’不允許對bit目標(biāo)或特殊函數(shù)寄存器sfr
190 &不是一個左值
嘗試建立一個指針指向一個未知目標(biāo)
193非法操作類型
193對ptr非法add/sub
193對bit的非法操作
193錯誤操作數(shù)類型
當(dāng)對一個給定的操作符用了非法的操作數(shù)類型時產(chǎn)生本錯誤例如無效的表
達(dá)式如bit*bitptr+ptr或ptr*anything這個錯誤信息包括引起錯誤的操作
符
下面的操作對bit類型的操作數(shù)是可行的
??賦值=
??OR/復(fù)合OR ||=
??AND/復(fù)合AND& &=
??XOR/復(fù)合XOR^ ^=
??bit比較= = !=
??取反~
bit操作數(shù)可和別的數(shù)據(jù)類型在表達(dá)式中混用在這種情況類型轉(zhuǎn)換自動執(zhí)行
194 *間接指向一個未知大小的目標(biāo)
間接操作符*不能和void指針合用因為指針?biāo)傅哪繕?biāo)的大小是未知的
195 *間接非法
*操作符不能用到非指針參數(shù)
196存儲空間可能無效
轉(zhuǎn)換一個常數(shù)到一個指針常數(shù)產(chǎn)生一個無效的存儲空間例如char
*p=0x91234
198 sizeof返回零
sizeof操作符返回一個零
199 ->’的左邊要求struct/union指針
->操作符的左邊參數(shù)必須是一個struct指針或一個union指針
200 .左邊要求struct/union
.操作符的左邊參數(shù)要求必須是struct或union類型
201未定義的struct/union
給定的struct或union名是未知的
202未定義的標(biāo)識符
給定的標(biāo)識符是未定義的
203錯誤的存儲類參考名
本錯誤表示編譯器的一個問題如果重復(fù)出現(xiàn)請接洽技術(shù)支持
204未定義的成員
給定的一個struct或union成員名是未定義的
205不能調(diào)用一個中斷函數(shù)
一個中斷函數(shù)不能象一個正常函數(shù)一樣調(diào)用中斷的入口和退出代碼是特殊
的
207參數(shù)列表聲明為void
參數(shù)列表聲明為void的函數(shù)不能從調(diào)用者接收參數(shù)
208太多的實參
函數(shù)調(diào)用包含太多的實參
209太少的實參
調(diào)用函數(shù)包含太少的實參
210太多的嵌套調(diào)用
函數(shù)的嵌套調(diào)用不能超過10級
211調(diào)用不是對一個函數(shù)
一個函數(shù)的調(diào)用項不是對一個函數(shù)或函數(shù)指針求值
212間接調(diào)用寄存器的參數(shù)不匹配
通過一個指針的間接函數(shù)調(diào)用不包含實際的參數(shù)一個例外是當(dāng)所有的參數(shù)可
以通過寄存器傳遞這是由于Cx51所用的傳遞參數(shù)的方法被調(diào)用的函數(shù)名
必須是已知的因為參數(shù)寫到被調(diào)用函數(shù)的數(shù)據(jù)段但是對間接調(diào)用來說
被調(diào)用函數(shù)的名稱是未知的
213賦值符的左邊不是一個左值
賦值符的左邊要求一個可修改目標(biāo)的地址
214非法指針轉(zhuǎn)換
bit float或集合類型的目標(biāo)不能轉(zhuǎn)換為指針
215非法類型轉(zhuǎn)換
struct/union/void不能轉(zhuǎn)換為任何別的類型
216標(biāo)號用在非數(shù)組中或維數(shù)超出
一個數(shù)組引用包含太大的維數(shù)或目標(biāo)不是一個數(shù)組
217非整數(shù)索引
一個數(shù)組的維數(shù)表達(dá)式必須是char unsigned char int或unsigned int類型
別的類型都是非法的
218控制表達(dá)式用了void類型
在一個while for或do的限制表達(dá)式中不能用類型void
219 long常數(shù)縮減為int
一個常數(shù)表達(dá)式的值必須能用一個int類型表示
220非法常數(shù)表達(dá)式
期望一個常數(shù)表達(dá)式目標(biāo)名變量或函數(shù)不允許出現(xiàn)在常數(shù)表達(dá)式中
221非常數(shù)case/dim表達(dá)式
一個case或一個維數(shù)[ ]必須是一個常數(shù)表達(dá)式
222被零除
223被零取模
編譯器檢測到一個被零除或取模
225表達(dá)式太復(fù)雜需簡化
一個表達(dá)式太復(fù)雜必須分成兩個或多個子表達(dá)式
226重復(fù)的struct/union/enum標(biāo)記
一個struct union或enum名早已定義
227表示一個union標(biāo)記
一個union名稱早已定義為別的類型
228表示一個struct標(biāo)記
一個struct名早已定義為別的類型
229表示一個enum標(biāo)記
一個enum名早已定義為別的類型
230未知的struct/union/enum標(biāo)記
指定的struct union或enum名未定義
231重復(fù)定義
指定的名稱已被定義
232重復(fù)標(biāo)號
指定的標(biāo)號已定義
233未定義標(biāo)號
表示一個標(biāo)號未定義有時候這個信息會在實際的標(biāo)號的幾行后出現(xiàn)這是所
用的未定義標(biāo)號的搜索方法引起的
234 {堆棧范圍溢出31
超過了最多31個嵌套塊超出的嵌套塊被忽略
235參數(shù)<數(shù)字>不同類型
函數(shù)聲明的參數(shù)類型和函數(shù)原型中的不同
236參數(shù)列表的長度不同
函數(shù)聲明中的參數(shù)數(shù)目和函數(shù)原型中的不同
237函數(shù)早已定義
試圖聲明一個函數(shù)體兩次
238重復(fù)成員
239重復(fù)參數(shù)
試圖定義一個已存在的struct成員或函數(shù)參數(shù)
240超出128個局部bit
在一個函數(shù)內(nèi)不能超過128個bit標(biāo)量
241 auto段太大
局部目標(biāo)所需的空間超過模式的極限最大的段大小定義如下
SMALL128字節(jié)
COMPACT256字節(jié)
LARGE65535字節(jié)
242太多的初始化軟件
初始化軟件的數(shù)目超過初始化目標(biāo)的數(shù)量
243字符串超出范圍
字符串中的字符數(shù)目超出字符串初始化的數(shù)目
244不能初始化錯誤的類型或類
試圖初始化一個bit或sfr
245未知的pragma跳過本行
#pragma狀態(tài)未知所以整行被忽略
246浮點錯誤
當(dāng)一個浮點參數(shù)超出32位的范圍就產(chǎn)生本錯誤32位IEEE值的范圍是
±1.175494E-38到±3.402823E+38
247非地址/常數(shù)初始化
一個有效的初始化表達(dá)式必須是一個常數(shù)值求值或一個目標(biāo)名加或減去一個常
數(shù)
248集合初始化需要大括號
給定struct或union初始化缺少大括號{}
249段<名>段太大
編譯器檢測到一個數(shù)據(jù)段太大一個數(shù)據(jù)段的最大的大小由存儲空間決定
250 esc值超過255
一個字符串常數(shù)中的轉(zhuǎn)義序列超過有效值范圍最大值是255
252非法八進(jìn)制數(shù)
指定的字符不是一個有效的八進(jìn)制數(shù)
252主要控制放錯地方行被忽略
主要控制必須被指定在C模塊的開頭在任何#include命令或聲明前
253內(nèi)部錯誤ASMGENCLASS
在下列情況下出現(xiàn)本錯誤
??一個內(nèi)在函數(shù)例如_testbit_被錯誤激活這種情況是在沒有函數(shù)原
型存在和實參數(shù)目或類型錯誤對這種原因必須使用合適的聲明文件
INTRINS.H STRING.H參考第八章中的instrinsic函數(shù)
??Cx51確認(rèn)一個內(nèi)部一致性問題請接洽技術(shù)支持
255 switch表達(dá)式有非法類型
在一個switch表達(dá)式?jīng)]有合法的數(shù)據(jù)類型
256存儲模式?jīng)_突
一個包含alien屬性的函數(shù)只能包含模式標(biāo)識符small函數(shù)的參數(shù)必須位于內(nèi)
部數(shù)據(jù)區(qū)這適用于所有的外部alien聲明和alien函數(shù)例如
alien plm_func(char c) large {…}
產(chǎn)生錯誤256
257 alien函數(shù)不能重入
一個包含alien屬性的函數(shù)不能同時包含reentrant屬性函數(shù)參數(shù)不能跳過虛擬
堆棧傳遞這適用于所有的外部alien聲明和alien函數(shù)
258 struct/union成員的存儲空間非法
非法空間的參數(shù)被忽略
一個結(jié)構(gòu)的成員或參數(shù)不能包含一個存儲類型標(biāo)識符但指針?biāo)傅哪繕?biāo)可
能包含一個存儲類型例如
struct vp{char code c;int xdata i; };
產(chǎn)生錯誤258
struct v1{char c;int xdata *i; };
是正確的struct聲明
259指針不同的存儲空間
一個空指針被關(guān)聯(lián)到別的不同存儲空間的空指針例如
char xdata *p1;
char idata *p2;
p1 = p2; /*不同的存儲空間*/
260指針斷開
一個空指針被關(guān)聯(lián)到一些常數(shù)值這些值超過了指針存儲空間的值范圍例如
char idata *p1 = 0x1234; /*結(jié)果是0x34 */
261 reentrant()內(nèi)有bit
一個可重入屬性的函數(shù)的聲明中不能包含bit目標(biāo)例如
int func1(int i1) reentrant {
bit b1,b2; /*不允許*/
return(i1-1);
}
262 using/disable不能返回bit值
用using屬性聲明的函數(shù)和禁止中斷#pragma disable的函數(shù)不能返回一個bit
值給調(diào)用者例如
bit test(void) using 3
{
bit b0;
return(b0);
}
產(chǎn)生錯誤262
263保存/恢復(fù)堆棧保存溢出/下溢
#pragma save的最大嵌套深度是八級堆棧的pragma save和restore工作根據(jù)
LIFO后進(jìn)先出規(guī)則
264內(nèi)在的<內(nèi)在的名稱>聲明/激活錯誤
本錯誤表示一個內(nèi)在的函數(shù)錯誤定義參數(shù)數(shù)目或省略號如果用標(biāo)準(zhǔn)的.H
文件就不會產(chǎn)生本錯誤確認(rèn)使用了Cx51所有的.H文件不要嘗試對內(nèi)在的
庫函數(shù)定義自己的原型
265對非重入函數(shù)遞歸調(diào)用
非重入函數(shù)不能被遞歸調(diào)用因為這樣會覆蓋函數(shù)的參數(shù)和局部數(shù)據(jù)如果需
要遞歸調(diào)用需聲明函數(shù)為可重入函數(shù)
267函數(shù)定義需要ANSI類型的原型
一個函數(shù)被帶參數(shù)調(diào)用但是聲明是一個空的參數(shù)列表原型必須有完整的參
數(shù)類型這樣編譯器就可能通過寄存器傳遞參數(shù)和適合應(yīng)用的調(diào)用機制
268任務(wù)定義錯誤任務(wù)ID/優(yōu)先級/using
任務(wù)聲明錯誤
271 asm/endasm控制放錯地方
asm和endasm聲明不能嵌套endasm要求一個匯編塊前面用asm開頭例如
#pragma asm
...
匯編指令
... #pragma endasm
272 asm要求激活SRC控制
在一個源文件中使用asm和endasm要求文件用SRC控制編譯那么編譯器就
會生成匯編源文件然后可以用A51匯編
273 asm/endasm在包含文件中不允許
在包含文件中不允許asm和endasm為了調(diào)試在包含文件不能有任何的可執(zhí)
行代碼
274非法的絕對標(biāo)識符
絕對地址標(biāo)識符對位目標(biāo)函數(shù)和局部函數(shù)不允許地址必須和目標(biāo)的存儲
空間一致例如下面的聲明是無效的因為間接尋址的范圍是0x00到0xFF
idata int _at_ 0x1000;
278常數(shù)太大
當(dāng)浮點參數(shù)超出32位的浮點值范圍就產(chǎn)生本錯誤32位IEEE值的范圍是
±1.175494E-38到±3.402823E+38
279多次初始化
試圖多次初始化一個目標(biāo)
280沒有使用符號/標(biāo)號/參數(shù)
在一個函數(shù)中聲明了一個符號標(biāo)號或參數(shù)但沒有使用
281非指針類型轉(zhuǎn)換為指針
引用的程序目標(biāo)不能轉(zhuǎn)換成一個指針
282不是一個SFR引用
本函數(shù)調(diào)用要求一個SFR作為參數(shù)
283asmparms參數(shù)不適合寄存器
參數(shù)不適合可用的CPU寄存器
284 <名稱>:在可覆蓋空間函數(shù)不再可重入
一個可重入函數(shù)包含對局部變量的明確的存儲類型標(biāo)識符函數(shù)不再
完全可重入
300注釋未結(jié)束
一個注釋沒有一個結(jié)束符*/
301期望標(biāo)識符
一個預(yù)處理器命令期望一個標(biāo)識符
302誤用#操作符
字符操作符#沒有帶一個標(biāo)識符
303期望正式參數(shù)
字符操作符#沒有帶一個標(biāo)識符表示當(dāng)前所定義的宏的一個正式
參數(shù)名
304錯誤的宏參數(shù)列表
宏參數(shù)列表沒有一個大括號逗號分開的標(biāo)識符列表
305 string/char常數(shù)未結(jié)束
一個字符串活字符常數(shù)是無效的典型的后引號丟失
306宏調(diào)用未結(jié)束
預(yù)處理器在收集和擴展一個宏調(diào)用的實際的參數(shù)時遇到輸入文件的結(jié)
尾
號錯誤信息和說明
307宏名稱參數(shù)計算不匹配
在一個宏調(diào)用中實際的參數(shù)數(shù)目和宏定義的參數(shù)數(shù)目不匹配本錯
誤表示指定了太少的參數(shù)
308無效的整數(shù)常數(shù)表達(dá)式
一個if/elif命令的數(shù)學(xué)表達(dá)式包含一個語法錯誤
309錯誤或缺少文件名
在一個include命令中的文件名參數(shù)是無效的或沒有
310條件嵌套過多20
源文件包含太多的條件編譯嵌套命令最多允許20級嵌套
311 elif/else控制放錯地方
312 endif控制放錯地方
命令elif else和endif只有在if ifdef或ifndef命令中是合法的
313不能清除預(yù)定義的宏名稱
試圖清除一個預(yù)定義宏用戶定義的宏可以用#undef命令刪除預(yù)定
義的宏不能清除
314 #命令語法錯誤
在一個預(yù)處理器命令中字符#必須跟一個新行或一個預(yù)處理器
命令名例如if/define/ifdef …
315未知的#命令名稱
預(yù)處理器命令是未知的
316條件未結(jié)束
到文件結(jié)尾endif的數(shù)目和if或ifdef的數(shù)目不匹配
318不能打開文件文件名
指定的文件不能打開
319文件不是一個磁盤文件
指定的文件不是一個磁盤文件文件不能編輯
320用戶自定義的內(nèi)容
本錯誤號未預(yù)處理器的#error命令保留#error命令產(chǎn)生錯誤號320
送出用戶定義的錯誤內(nèi)容終止編譯器生成代碼
321缺少<字符>
在一個include命令的文件名參數(shù)中缺少結(jié)束符例如
#include 325正參名稱重復(fù) 一個宏的正參只能定義一次 326宏體不能以##開始或結(jié)束 ##不能是一個宏體的開始或結(jié)束 327宏宏名超過50個參數(shù) 每個宏的參數(shù)數(shù)目不能超過50 警告 警告產(chǎn)生潛在問題的信息他們可能在目標(biāo)程序的運行過程中出現(xiàn)警告不妨礙源文 件的編譯 警告在列表文件中生成信息警告信息用下面的格式 *** WARNINGnumberIN LINElineOFfile:warning message 這里 number錯誤號 line在源文件或包含文件中的對應(yīng)行號 file錯誤產(chǎn)生的源或包含文件名 warning message警告的內(nèi)容 下表按號列出了警告警告信息包括一個主要的內(nèi)容和可能的原因和糾正措施 號警告信息和說明 173缺少返回表達(dá)式 一個函數(shù)返回一個除了int類型以外的別的類型的值必須包含一個 返回聲明包括一個表達(dá)式為了兼容舊的程序?qū)Ψ祷匾粋€int值 的函數(shù)不作檢查 182指針指向不同的目標(biāo) 一個指針關(guān)聯(lián)了一個不同類型的地址 185不同的存儲空間 一個目標(biāo)聲明的存儲空間和前面聲明的同樣目標(biāo)的存儲空間不同 196存儲空間可能無效 把一個無效的常數(shù)值分配給一個指針無效的指針常數(shù)是long或 unsigned long編譯器對指針采用24位3字節(jié)低16位代表偏移 高8位代表選擇的存儲空間 198 sizeof返回零 一個目標(biāo)的大小計算結(jié)果為零如果目標(biāo)是外部的或如果一個數(shù)組 的維數(shù)沒有全知道則值是錯誤的 號警告信息和說明 206缺少函數(shù)原型 因為沒有原型聲明被調(diào)用的函數(shù)是未知的調(diào)用一個未知的函數(shù)通 常是危險的參數(shù)的數(shù)目和實際要求不一樣如果是這種情況函數(shù) 調(diào)用不正確 沒有函數(shù)原型編譯器不能檢查參數(shù)的數(shù)目和類型要避免這種警告 應(yīng)在程序中包含函數(shù)的原型 函數(shù)原型必須在函數(shù)被調(diào)用前聲明注意函數(shù)定義自動生成原型 209實參太少 在一個函數(shù)調(diào)用中包含太少的實參 219 long常數(shù)被縮減為int 一個常數(shù)表達(dá)式的值必須能被一個int類型所表示 245未知的pragma本行被忽略 #pragma聲明是未知的因此整行程序被忽略 258 struct/union成員的存儲空間方法 參數(shù)的存儲空間被忽略 一個結(jié)構(gòu)的成員或一個參數(shù)不能指定存儲類型但是指針?biāo)傅哪?/p> 標(biāo)可以包含一個存儲類型例如 struct vp{ char code c;int xdata i; }; 產(chǎn)生警告258 struct v1{ char c;int xdata *i; }; 對struct是正確的聲明 259指針不同的存儲空間 兩個要比較的指針沒有引用相同的存儲類型的目標(biāo) 260指針折斷 把一個指針轉(zhuǎn)換為一個更小偏移區(qū)的指針轉(zhuǎn)換會完成但大指針的 偏移會折斷來適應(yīng)小指針 261 bit在重入函數(shù) 一個reentrant函數(shù)不能包含bit因為bit標(biāo)量不能保存在虛擬堆棧中 265名稱對非重入函數(shù)遞歸調(diào)用 發(fā)現(xiàn)對一個非重入函數(shù)直接遞歸這可能是故意的但對每個獨立的 情況進(jìn)行功能性檢查通過生成的代碼間接遞歸由連接/定位器檢 查 號警告信息和說明 271 asm/endams控制放錯地方 asm和endasm不能嵌套endasm要求一個以asm聲明開頭的匯編塊 例如 #pragma asm ... 匯編指令 ... #pragma endasm 275表達(dá)式可能無效 編譯器檢測到一個表達(dá)式不生成代碼例如 void test(void) { int i1,i2,i3; i1,i2,i3; /*死表達(dá)式*/ i1 << i3; /*結(jié)果未使用*/ } 276常數(shù)在條件表達(dá)式 編譯器檢測到一個條件表達(dá)式有一個常數(shù)值在大多數(shù)情況下是一個 輸入錯誤例如 void test(void) { int i1,i2,i3; if( i1 = 1) i2 = 3; /*常數(shù)被賦值*/ while( i3 = 2); /*常數(shù)被賦值*/ } 277指針有不同的存儲空間 一個typedef聲明的存儲空間沖突例如 typedef char xdata XCC; /*存儲空間xdata */ typedef XCC idata PICC; /*存儲空間沖突*/ 280符號/標(biāo)號未使用 一個符號或標(biāo)號定義但未使用 307宏名稱參數(shù)計算不匹配 一個宏調(diào)用的實參的數(shù)目和宏定義的參數(shù)數(shù)目不匹配表示用了太多 的的參數(shù)過剩的參數(shù)被忽略 317宏名稱重新定義無效 一個預(yù)定義的宏不能重新定義或清除參考138頁的預(yù)定義宏常數(shù) 322未知的標(biāo)識符 在一個#if命令行的標(biāo)識符未定義等效為FALSE 323期望新行發(fā)現(xiàn)多余字符 一個#命令行正確但包含多余的非注釋字符例如 #include 324期望預(yù)處理器記號 期望一個預(yù)處理器記號但輸入的是一個新行例如#line這里缺 少#line命令的參數(shù)