2024年1月1日发(作者:)

࢒໕ᐺࡇᇙቧᇦ和警告信息每节包括一个信息本章列出了编程中可能遇到的致命错误语法错误的主要说明和消除错误或警告条件可采取的措施致命错误致命错误立即终止编译这些错误通常是命令行指定的无效选项的结果能访问一个特定的源包含文件时也产生致命错误致命错误信息采用下面的格式C51 FATAL-ERROR –ACTIONLINE:ERROR:C51 TERMIANTED.C51 FATAL-ERROR –ACTIONFILE:ERROR:C51 TERMIANTED.下面说明Action和Error中可能的内容当编译器不

ActionsALLOCATING MEMORY编译器不能分配足够的存储区来编译指定的源文件CREATING LIST-FILE / OBJECT-FILE / WORKFILE编译器不能建立列表文件OBJ文件或工作文件满或写保护或文件已存在和只读这个错误的出现可能是磁盘GENERATING INTERMEDIATE CODE源文件包含的一个函数太大不能被编译器编译成虚拟代码重新编译OPENING INPUT-FILE编译器不能发现或打开所选的源或包含文件尝试把函数分小或PARSING INVOKE-/#PRAGMA-LINE当在命令行检测到参数计算或在一个#pragma中检测到参数计算的错误就产生这样PARSING SOURCE-FILE / ANALYZING DECLARATIONS源文件包含太多的外部参考减少源文件访问的外部变量和函数的数目WRITING TO FILE当写入列表文件OBJ文件或工作文件时遇到的错误

Errors‘(‘ AFTER CONTROL EXPECTED一些控制参数需要用括号包含一个参数当没有左括号时显示本信息‘)’ AFTER PARAMETER EXPECTED本信息表示包含没有参数的右括号BAD DIGIT IN NUMBER一个控制参数的数字参数包含无效字符只能是十进制数CAN’T CREATE FILE在FILE行定义的文件名不能建立CAN’T HAVE GERERAL CONTROL IN INVOCATION LINE一般控制例如EJECT不能包含在命令行把这些控制用#pragma声明放在源文件中FILE DOES NOT EXIST没有发现定义在FILE行的文件FILE WRITE-ERROR因为磁盘空间不够写到列表预打印工作或目标文件时出错IDENTIFIER EXPECTED当DEFINE控制没有参数时产生本信息和C语言的规则相同DEFINE要求一个参数作为标识符这MEMORY SPACE EXHAUSTED编译器不能分配足够的存储区来编译指定的源文件该把源文件分成两个或多个小文件再重新编译MORE THAN 100 ERRORS IN SOURCE-FILE在编译时检测到的错误超过100个这使编译器终止如果始终出现这个信息应MORE THAN 256 SEGMENTS/EXTERNALS在一个源文件中的参考超过256个单个的源文件不能有超过256个函数或外部参考这是INTEL目标模块格式OMF-51的历史的限制包含标量和/或bit声明的函数在OBJ文件中生成两个有时候三个段定义

NON-NULL ARGUMENT EXPECTED所选的控制参数需要用括号包含一个参数例如OUT OF RANGE NUMBER一个控制参数的数字参数超出范围7就将产生本错误信息一个文件名或一个数字例如OPTIMIZE控制只允许数字0到6值PARSE STACK OVERFLOW解析堆栈溢出如果源程序包含很复杂的表达式或如果块的嵌套深度超过31级就会出现这个错误PREPROCESSORLINE TOO LONG一个中间扩展长度超过32K字符32KPREPROCESSORMACROS TOO NESTED在宏扩展期间预处理器所用的堆栈太大这个信息通常表示一个递归的宏定义但也可表示一个宏嵌套太多RESPECIFIED OR CONFLICTING CONTROL一个命令行参数指定了两次或命令行参数冲突SOURCE MUST COME FROM A DISK-FILECI源和包含文件必须存在控制台CONUNKNOWN CONTROL所选的控制参数不认识或类似的设备不能作为输入文件

语法和语义错误语法和语义错误一般出现在源程序中它们确定实际的编程错误当遇到这些错误时编译器尝试绕过错误继续处理源文件当遇到更多的错误时编译器输出另外的错误信息但是不产生OBJ文件语法和语义错误在列表文件中生成一条信息这些错误信息用下面的格式*** ERROR number IN LINE line OF file:error message这里numberlinefileerror message错误号对应源文件或包含文件的行号产生错误的源或包含文件名对错误的叙述说明错误信息列出了主要说明和可能的原因和改正下表按错误号列出了语法和语义错误125跳过不可打印字符0x??在源文件中发现一个非法字符注意不检查注释中的字符字符串没结束一个字符串没有用双引号终止字符串太长一个字符串不能超过4096个字符用串联符号在逻辑上可延长字符串超过4096个字符这个模式的行终止符在词汇分析时是连续的无效的字符常数一个字符常数的格式无效符号c是无效的除非c是任何可打印的ASCII字符声明符太复杂20一个目标的声明可包含最多20个类型修饰符[]*这个错误经常伴随着错误126

0131132类型堆栈下溢类型声明堆栈下溢这个错误通常死错误125的副产品无效存储类一个目标用一个无效的存储空间标识符声明如果一个目标在一个函数外用存储类auto或register声明就会产生本错误在标记前缺少本错误通常表示前一行缺少分号当出现本错误时编译器会产生很多错误信息值超出范围在一个using或interrupt标识符后的数字参数是无效的using标识符要求一个0到3之间的寄存器组号interrupt标识符要求一个0到31之间的中断矢量号函数参数重复一个函数有相同的参数名在函数声明中参数名必须是唯一的没在正式的参数列表一个函数的参数声明用了一个名称没在参数名列表中例如char function(v0,v1,v2)char *v0,*v1,*v5;/* ‘v5’没在正式列表中 */{ /* … */}函数的xdata/idata/pdata/data不允许函数通常位于code存储区不能在别的存储区运行函数默认定义为存储类型codebit的存储类错bit标量的声明可能包含一个static或extern存储类register或alien类是无效的变量用了voidvoid类型只允许作为一个不存在的返回值或一个函数的空参数列表voidfunc(void)或和一个指针组合void *Interrupt()不能接受或返回值一个中断函数被定义了一个或多个正式的参数或一个返回值中断函数不能包含调用参数或返回值位在非法的存储空间bit标量的定义可以包含可选的存储类型data如果没有存储类型则默认为data因为位通常在内部数据存储区当试图对一个bit标量定义别的数据类型时会产生本错误临近标志语法错误期待别的标志…编译器所见的标志是错误的参考所显示的期待的内容无效的基地址一个sfr或sbit声明的基地址是错误的有效的基地址范围在0x80到0xFF之间如果用符号基地址^位号声明则基地址必须是8的倍数8140141142

659160161无效的绝对位地址sbit声明中的绝对位地址必须在0x80到0xFF之间基地址^位号无效的位号sbit声明中定义的位号必须在0到7之间未知的sfr无效sfr一个绝对位基地址^位号的声明包含一个无效的基地址标识符基地址必须是已经声明的sfr任何别的名称是无效的目标文件太大单个目标文件不能超过6553564K字节-1struct/union包含函数成员struct或union不能包含一个函数类型的成员但是指向函数的指针是可以的struct/union包含一个bit成员一个union不能包含bit类型成员这是8051的结构决定的struct/union自我关联一个结构不能包含自己位号超出位域位域声明中指定的位号超过给定基类的位号命名的位域不能为零命名的位域为零只要未命名的位域允许为零位域指针指向位域的指针不允许位域要求char/int位域的基类要求char或intunsigned char和unsigned int类型也行alien只允许对函数alien函数带可变参数存储类alien只对外部PL/M-51函数允许符号char *,…在alien函数中是非法的PL/M-51函数通常要求一个固定的参数表函数包含未命名的参数一个函数的参数列表定义包含一个未命名的抽象类型定义这个符号只允许在函数原型中void后面带类型函数的原型声明可包含一个空参数列表例如int func(void)在void后不能再有类型定义void无效void类型只在和指针组合或作为一个函数的不存在的返回值中是合法的忽视了正式参数在一个函数内一个外部函数的声明用了一个没有类型标识符的参数名列表例如extern yylex(a,b,c);

8189193不能指向一个函数指向一个函数的类型是无效的尝试用指针指向一个函数操作数不兼容对给定的操作符至少一个操作数类型是无效的例如~float_type左值不能修改要修改的目标位于code存储区或有const属性因此不能修改sizeof非法操作数sizeof操作符不能确定一个函数或位域的大小不同的存储空间一个目标声明的存储空间和前一个同样目标声明的存储空间不同解除参照无效一个内部编译器问题会产生本信息如果本错误重复出现请和技术支持接洽不是一个左值所需的参数必须是一个可修改的目标地址未知目标大小因为没有一个数组的维数或间接通过一个void指针一个目标的大小不能计算&对bit/sfr非法取地址符’&’不允许对bit目标或特殊函数寄存器sfr&不是一个左值尝试建立一个指针指向一个未知目标非法操作类型对ptr非法add/sub对bit的非法操作错误操作数类型当对一个给定的操作符用了非法的操作数类型时产生本错误例如无效的表达式如bit*bitptr+ptr或ptr*anything这个错误信息包括引起错误的操作符下面的操作对bit类型的操作数是可行的