C51keil编译常见错误和警告处理.docx
- 文档编号:7443781
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:16
- 大小:24.19KB
C51keil编译常见错误和警告处理.docx
《C51keil编译常见错误和警告处理.docx》由会员分享,可在线阅读,更多相关《C51keil编译常见错误和警告处理.docx(16页珍藏版)》请在冰豆网上搜索。
C51keil编译常见错误和警告处理
C51-keil编译常见错误和警告处理53
keil错误;C51编译器识别错类型有三种:
1、致命错误:
伪指令控制行有错,访问不存在的原文;
2、语法及语义错误:
语法和语义错误都发生在原文件;
3、警告:
警告出现并不影响目标文件的产生,但执行;
C_51FATAL_ERRORACTION:
&l;ERROR:
<错误信息>termin;FILE:
<错误所在文件>;ERROR:
<错误信息>
keil错误
C51编译器识别错类型有三种
1、致命错误:
伪指令控制行有错,访问不存在的原文件或头文件等。
2、语法及语义错误:
语法和语义错误都发生在原文件中。
有这类错误时,给出提示但不产生目标文件,错误超过一定数量才终止编译。
3、警告:
警告出现并不影响目标文件的产生,但执行时有可能发生问题。
程序员应斟酌处理。
D.1致命错误
C_51FATAL_ERRORACTION:
<当前行为>LINE:
<错误所在行>
ERROR:
<错误信息>terminated或C_51FATALERRORACTION:
<当前行为>FILE:
<错误所在文件>
ERROR:
<错误信息>terminatedC_51TERMINATEDC_51
(1)ACTION的有关信息
*PARSINGINVOKE-/#PRAGMA_LINE
在对#pragma指明的控制行作此法分析时出错。
*ALLOCATINGMEMORY
系统分配存储空间时出错。
编译较大程序需要512k空间。
*OPENINGINPUT_FILE打开文件时,未找到或打不开源文件/头文件。
*CREATELIST_FILE/OBJECT_FILE/WORK_FILE
不能创建上述文件。
可能磁盘满或文件已存在而且写保护。
*PARSINGSOURCE_FILE/ANALYZINGDECLARATIONS
分析源程序时发现外部引用名太多。
*GENERATINGINTERMEDIATECODE
源代码被翻译成内部伪代码,错误可能来源于函数太大而超过内部极限。
*WRITINGTOFILE
在向文件(work,list,prelist或objectfile)写时发生错误。
(2)ERROR的有关信息
*MEMORYSPACEEXHAUSTED
所有可用系统空间耗尽。
至少需要512k字节空间。
没有足够空间,用户必须检查常驻内存的驱动程序是否太多。
*FILEDOESNOTEXISTFILE
行定的文本文件名未发现。
*CAN?
TCREATFILE
FILE行定义的文件不能被创建。
*SOURCEMUSTCOMEFROMADISK_FILE
源文件和头文件必须存在于硬盘或软盘上。
控制台、CON、CI或类似设备不允许作为输入文件。
*MORETHAN256SEGMENTS/PUBLICS/EXTERNALS
受OMF_51的历史限制,一个源程序不能超过256个各种函数的类型段,256个全局变量,256个公共定义或外部引用名。
不使用为变量可以减少使用的段数。
使用static存储类型说明符可减少全局变量的使用数目。
合理调整定义性说明的位置可减少外部引用名的使用数目。
*FILEWRITEERROR
当向list、prelist、work或object文件中写内容时,由于空间不够而发生错误。
*NON_NULLARGUMENTEXPECTED
所选的控制参数需要一个括号内的变量,如一个文件夹或一个数。
*“(”AFTERCONTROLEXPECTED
变量的左括号丢失。
*“)”AFTERPARAMETEREXPECTED
变量的右括号丢失。
*RESPECIFIEDORCONFLICTINGCONTROL
所选的控制参数与前面发生冲突或重复,例如CODE和NOCOND。
*BADDECIMALNUMBER
控制参数的数字含有非法数,需要使用十进制数。
*OUTOFRANGEDECIMALNUMBER
控制参数的数字越界,例如OPTIMIZE的参量为0-5。
*IDENTIFIEREXPECTED
控制参数DEFINE需要一个标识符做参量,与C语言的规则相同。
*PARSESTACKOVERFLOW
分析栈溢出。
可能是源程序包含特别复杂的表达式,或功能块嵌套数超过15。
*PREPOCESSOR:
MACROTONESTED
宏扩展期间,预处理器的栈耗用太大。
表明宏嵌套太多,或有递归宏定义。
*PREPOCESSOR:
LINETOOLONG(510)
宏扩展后行超过510个字符。
*CAN?
THAVEGENERALCONTROLININVOCATIONLINE
一般控制(如EJECT)不能是命令行的一部分,应将它们放入源文件“pragma”预处理行中。
D.2语法及语义错误
D.2.1错误格式
这类错误在列表文件中产生如下格式的信息:
***ERROR
errormessage
***WARING
warningmessage
表示错误行;
D.2.2错误信息及可能发生的原因
*ERROR100:
unprintablecharacter0x?
?
skipped
源文件中发现非法字符(注意,注解内的字符不做检查)。
*ERROR101:
unclosedstring
串未用引号结尾。
*ERROR102:
stringtoolong
串不得超过511个字符。
为了定义更长的串,用户必须使用续行符?
\?
逻辑的继续该串,在词汇分析时遇到以该符号结尾的行会与下行连接起来。
*ERROR103:
invalidcharacterconstant
试图再声明一个已定义的宏,已存在的宏可以用#undef指令删除。
预定义的宏不能删除。
*ERROR104:
identifierexpected
预处理器指令期望产生一个标示符,如ifdef
*ERROR105:
unclosedcomment
当注解无结束界定符(*/)时产生此错误。
*EROOR106:
unbalanced#if-endif
controlsendif的数量与if或ifdef的数量不匹配。
*ERROR107:
includefilenestingexceeds9include
指令后的文件名无效或丢失。
*ERROR108:
expectedstring
如#error“string”预处理器指令期望一个串变量。
*ERROR109:
由#error伪指令引入的错误信息以错误信号形式显示。
*ERROR110:
missingdirective
预处理行#后缺少伪指令。
*ERROR111:
unknowndirective
预处理行#后不是伪指令。
*ERROR112:
misplaced?
elif?
*ERROR113:
misplaced?
else?
*ERROR114:
misplaced?
endif?
指令elif/else/endif只有在if、ifdef、ifndef指令内才是合法的。
*ERROR117:
badintegerexpressionif/elif
指令的数值表达式有语法错误。
*ERROR118:
missing?
(?
aftermacroidentifier
宏调用中实参表的左括号丢失
*ERROR119:
reuseofmacroformalparameter
宏定义形参名重复使用
*ERROR120:
?
C?
unexpectedinformallist
形参表中不允许有字符?
c?
,应用逗号代替。
*ERROR121:
missing?
)?
afteractualparameter
宏调用实参表的右括号丢失
*ERROR122:
illegalmacroinvocation
宏调用的实参表与宏定义中的形参表不同。
*ERROR123:
missingmacronameafter?
define?
#define
伪指令后缺预定义的宏。
*ERROR124:
expectedmacroformalparameter
宏定义要求形参名。
*ERROR125:
declaratertoocomplex
说明过于复杂。
*ERROR126:
type-stackunderflow
对象的声明至多只能包含20个类型修饰符(【】,*,(),)错误126经常在错误125之前,两者一起发生。
*ERROR127:
invalidstorageclass
对象用无效的存储类所说明。
当在函数外用auto/register存储时会发生这种情况。
*ERROR128:
memoryspace:
illegalmemoryspace?
memoryspace?
used
函数参数的存储类由存储模式(SMALLLARGECOMPACT)决定用户不能改变,使用不同于存储模式的自动变量应该为静态的存储类。
*ERROR129:
missing?
;?
before?
token?
该错误表示分号丢失,通常该错误会引发一连串的错误,引发的这些错误无关紧要。
因为缺少分号后编译器不能做正确的语法分析
*ERROR130:
valueoutofrange
using或interrupt指令后参数越限。
using用的寄存器组号位0-3,interrupt需要0-15的中断号。
*ERROR131:
duplicatefunction-parameter
函数中形参名重复,形参名应彼此不同。
*ERROR132:
notinformalparameterlist
函数内参数声明使用的名字未出现在参数表中。
*ERROR133:
charfunction(v0,v1,v2)
Char*v0,*v1,*v5;/*?
v5?
在形参中未出现。
*ERROR134:
xdata/idata/pdata/dataonfunctionnotpermitted
函数总是驻留于0x5xxxx的code存储区,不能位于xdata/idata/pdata/data空间。
*ERROR135:
badstorageclassforbit
位变量的定义可以接受static或extern的存储类,用REGIESTER和ALIEN都是非法的。
*ERROR136:
?
void?
onvariable
?
void?
类型只允许作为函数的返回类型或与指针类型合用(void*)。
*ERROR137:
illegalparametertype:
?
function?
函数参数的类型不能是函数,然而函数指针可以作为参数。
*ERROR138:
interrupt()maynotreceiveorreturnvalue(s)
中断函数既不能有参数又不能有返回值。
*ERROR139:
illegaluseof?
alien?
关键字alien将函数定义为PL/M51规定的过程与函数结构。
这意味着C函数中有参数的缩记符号(即funct(…);)时是不能用alien的。
*ERROR140:
bitinillegalmemory-space
位变量的定义可包含修饰符DATA,如果无修饰符则假定为DATA。
因为位变量始终位于0x4xxx的内部数据存储器中,当试图采用其他存储空间就会产生这个错误。
*ERROR141:
NEAR
expected
编译器所见的单词是错误的,期望正确的单词。
*ERROR142:
invalidbaseaddress
Sfr说明中的基址有错。
有效基址为0x80-0xff。
如果声明采用base^pos形式,则基址是8的整数倍。
*ERROR143:
invalidabsolutebitposition
Sbit说明中位地址必须在0x80-0xff之间。
*ERROR144:
base^pos:
invalidbitpositionSbit
说明中位pos必须在0~7之间。
*ERROR145:
undeclaredsfrSfr
未说明。
*ERROR146:
invalidsfr
绝对位地址说明(base^pos)包含无效的基地址。
这个基地址必须与sfr名相对应。
*ERROR147:
objecttoolarge
对象不能超过65536(64k)字节。
*ERROR148:
fieldnotpermittedinunion
联合不能包含位成员,这个限制是由8051结构决定的。
*ERROR149:
functionmemberinstruct/union
结构或者联合不能包含函数类型的成员。
但是指向函数的指针是允许的。
*ERROR150:
bitmemberinstruct/union
结构或者联合不能包含位类型的成员,这个限制是由8051结构决定的。
*ERROR151:
selfrelativestruct/union
结构或者联合不能包含自身。
*ERROR152:
bitfieldtypetoosmallfornumberofbits
位域声明中指定的位数超过所给原型中位的数量。
*ERROR153:
namedbit-fieldcannothave0width
命名的域宽度为0错误,只有未命名的位域允许是0宽度。
*ERROR154:
protofield
无指向位域指针的类型。
*ERROR155:
char/intrequiredforfields
位域基类型要求char或int类型,unsignedchar或unsignedint也有效。
*ERROR156:
alienpermittedonfunctiononlyAlien
只能用于函数。
*ERROR157:
var_parmsonalienfunction
有变参数的函数不能用alien,因为PL/M51函数只能用固定数量的参数。
*ERROR158:
functioncontainsunnamedparameter
函数定义的参数表中包含无名参数。
无名参数只允许用于函数的原型中。
*ERROR159:
typefollowsvoid
函数原型声明中可含一个空的参数表f(void)。
Void后不能再用其他类型定义。
*ERROR160:
voidinvalid
Void类型只能与指针合用或表明函数没有返回值。
*ERROR161:
formalparameterignored
函数内的外部函数引用声明使用了无类型的参数表。
例如“extern(a,b,c);”要求形参表。
*ERROR162:
duplicatefunction-parameter
函数内参数名重复。
*ERROR163:
unknownarraysize
一般的不管是一维数组还是多维数组或外部数组,都需要指定数组的大小,这个大小是由编译器的初始化时计算,这个错误表明试图为一个未定维的数组使用sizeof运算符,会哦着一
个多维数组的附加元素未定义。
KEILC编译器常见警告与错误信息的解决办法
对于函数的自变量、局部变量和全局变量声明如果没有指定内存类型,则内存模式将成为内定的内存类型。
如果指定了内存类型的变量,则不理会内存模式,完全有所指定的内存类型为主。
SMALL模式:
小模式
所有的变量,局部变量或全局变量都指定存在内部RAM的0—0x7F的地址范围,此模式如同将所有的变量都定义成data类型的内存。
COMPACT模式:
压缩模式
所有的变量将被指定到其地址范围为0—0xFF的外部数据存储器,此模式如同将所有的变量都定义成pdata类型的内存。
LARGE模式:
大模式
所有的变量将被指定到其地址范围为0—0xFFFF的外部数据存储器,此模式如同将所有的变量都定义成xdata类型的内存。
Re:
BankSwitch無法編譯後的訊息
[QUOTE]原發表者是Vic
1.***WARNINGL15:
MULTIPLECALLTOSEGMENT
SEGMENT:
?
PR?
SD_INITIALIZE?
DRVSD
CALLER1:
?
C_C51STARTUP
CALLER2:
?
PR?
TIMER0_ISR?
INTERRUPT
這表示SD_INITIALIZE這個函式被C_C51STARTUP和中斷服務函式TIMER0_ISR呼叫到。
這樣會有什麼問題?
若是SD_INITIALIZE被呼叫時,TIMER0_ISR中斷發生而再呼叫SD_INITIALIZE就會有reentrant(重入)的問題。
KeilC51一般的函式的區域變數是放在同一個地方的,所以不能被重入。
如果程式保證這樣的情況不會發生(例如呼叫之前先disableinterrupt)可以不理會這個警告。
2.***ERRORL107:
ADDRESSSPACEOVERFLOW
SPACE:
XDATA
SEGMENT:
?
XD?
DRVMS
LENGTH:
0515H
XDATA使用過量囉!
減減肥吧!
3.***WARNINGL17:
INTERRUPTFUNCTIONINBANKSNOTALLOWED
SYMBOL:
INT0_ISR
SPACE:
BANK0
不可以把中斷函式放在bankarea
4.***WARNINGL4:
DATASPACEMEMORYOVERLAP
FROM:
003FH
TO:
0050H
某些data區被兩個器共用
5.***ERRORL105:
PUBLICREFERSTOIGNOREDSEGMENT
SYMBOL:
MEM_POOL
SEGMENT:
?
XD?
MTM808
6.***ERRORL118:
REFERENCEMADETOERRONEOUSEXTERNAL
SYMBOL:
SYSTEM_MODE
MODULE:
.\debug\mtm808.obj(MTM808)
ADDRESS:
3A7CH
7.***ERRORL118:
REFERENCEMADETOERRONEOUSEXTERNAL
SYMBOL:
ADPCM_STATE
MODULE:
.\debug\SystemManager.obj(SYSTEMMANAGER)
ADDRESS:
358FH
參照到一個無法使用的記憶段(可為前面之overfllow錯誤引起)
13.***WARNINGL1:
UNRESOLVEDEXTERNALSYMBOL
SYMBOL:
DATEI
MODULE:
.\mtm809.LIB(CMDIF)
找不到externalsymbol的實體,所以無法連結。
C编译器错误信息中文翻译
Ambiguousoperatorsneedparentheses
不明确的运算需要用括号括起
Ambiguoussymbol``xxx``
不明确的符号
Argumentlistsyntaxerror
参数表语法错误
Arrayboundsmissing
丢失数组界限符
Arraysizetoolarge
数组尺寸太大
Badcharacterinparamenters
参数中有不适当的字符
Badfilenameformatinincludedirective
包含命令中文件名格式不正确
Badifdefdirectivesynatax
编译预处理ifdef有语法错
Badundefdirectivesyntax
编译预处理undef有语法错
Bitfieldtoolarge
位字段太长
Callofnon-function
调用未定义的函数
Calltofunctionwithnoprototype
调用函数时没有函数的说明
Cannotmodifyaconstobject
不允许修改常量对象
Caseoutsideofswitch
漏掉了case语句
Casesyntaxerror
Case语法错误
Codehasnoeffect
代码不可述不可能执行到
Compoundstatementmissing{
分程序漏掉"{"
Conflictingtypemodifiers
不明确的类型说明符
Constantexpressionrequired
要求常量表达式
Constantoutofrangeincomparison
在比较中常量超出范围
Conversionmaylosesignificantdigits
转换时会丢失意义的数字
Conversionofnearpointernotallowed
不允许转换近指针
Couldnotfindfile``xxx``
找不到XXX文件
Declarationmissing;
说明缺少";"
Declarationsyntaxerror
说明中出现语法错误
Defaultoutsideofswitch
Default出现在switch语句之外
Definedirectiveneedsanidentifier
定义编译预处理需要标识符
Divisionbyzero
用零作除数
Dostatementmusthavewhile
Do-while语句中缺少while部分
Enumsyntaxerror
枚举类型语法错误
Enumerationconstantsyntaxerror
枚举常数语法错误
Errordirective:
xxx
错误的编译预处理命令
Errorwritingoutputfile
写输出文件错误
Expressionsyntaxerror
表达式语法错误
Extraparameterincall
调用时出现多余错误
Filenametoolong
文件名太长
Functioncallmissing)
函数调用缺少右括号
Fuctiondefinitionoutofplace
函数定义位置错误
Fuctionshouldreturnav
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C51keil 编译 常见 错误 警告 处理