c51 编译时致命的324个错误提醒,与大家分享

致命错误

致命错误立即终止编译这些错误通常是命令行指定的无效选项的结果当编译器不

能访问一个特定的源包含文件时也产生致命错误

致命错误信息采用下面的格式

C51 FATAL-ERROR –

ACTION :<current action>

LINE: <line in which the error is detected>

ERROR: <corresponding error message>

C51 TERMIANTED.

 

C51 FATAL-ERROR –

 

ACTION: <current action>

FILE: <file in which the error is detected>

 

ERROR: <corresponding error message>

C51 TERMIANTED.

下面说明ActionError中可能的内容

Actions

ALLOCATING 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控制没有参数时产生本信息.DEFINE要求一个参数作为标识符.

C语言的规则相同.

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

一个控制参数的数字参数超出范围.例如OPTIMIZE控制只允许数字06,

7就将产生本错误信息.

PARSE STACK OVERFLOW

解析堆栈溢出.如果源程序包含很复杂的表达式或如果块的嵌套深度超过31,

就会出现这个错误

PREPROCESSOR: LINE TOO LONG( 32K)

一个中间扩展长度超过32K字符.

PREPROCESSOR: MACROS TOO NESTED

在宏扩展期间,预处理器所用的堆栈太大.这个信息通常表示一个递归的宏定义,

但也可表示一个宏嵌套太多.

RESPECIFIED OR CONFLICTING CONTROL

一个命令行参数指定了两次,或命令行参数冲突.

SOURCE MUST COME FROM A DISK-FILE

源和包含文件必须存在.控制台CON;,; CI;, 或类似的设备不能作为输入文件.

UNKNOWN CONTROL

所选的控制参数不认识.

 

 

 

 

 

语法和语义错误

语法和语义错误一般出现在源程序中.它们确定实际的编程错误.当遇到这些错误时,

编译器尝试绕过错误继续处理源文件.当遇到更多的错误时,编译器输出另外的错误,

信息但是不产生OBJ文件.

语法和语义错误在列表文件中生成一条信息这些错误信息用下面的格式

*** ERROR number IN LINE line OF file:error message

这里

number        错误号

line               对应源文件或包含文件的行号

file                产生错误的源或包含文件名

error message 对错误的叙述说明

下表按错误号列出了语法和语义错误错误信息列出了主要说明和可能的原因和改正

号错误信息和说明

100 跳过不可打印字符0x??

在源文件中发现一个非法字符.(注意不检查注释中的字符)

101 字符串没结束

一个字符串没有用双引号终止.

102 字符串太长

一个字符串不能超过4096个字符用串联符号/ 在逻辑上可延长字符串

超过4096个字符这个模式的行终止符在词汇分析时是连续的

103 无效的字符常数

一个字符常数的格式无效符号/c 是无效的除非c是任何可打印的ASCII

字符

125 声明符太复杂20

一个目标的声明可包含最多20个类型修饰符[ ] *

个错误经常伴随着错误126

126 类型堆栈下溢

类型声明堆栈下溢这个错误通常死错误125的副产品

127 无效存储类

一个目标用一个无效的存储空间标识符声明如果一个目标在一个函数外用存

储类autoregister声明就会产生本错误

129 在标记前缺少

本错误通常表示前一行缺少分号当出现本错误时编译器会产生很多错误信

130 值超出范围

在一个usinginterrupt标识符后的数字参数是无效的using标识符要求一个0

3之间的寄存器组号interrupt标识符要求一个031之间的中断矢量号

131 函数参数重复

一个函数有相同的参数名在函数声明中参数名必须是唯一的

132 没在正式的参数列表

一个函数的参数声明用了一个名称没在参数名列表中例如

char function(v0,v1,v2)

char *v0,*v1,*v5;

/* ‘v5’没在正式列表中 */

{

/* … */

}

134 函数的xdata/idata/pdata/data不允许

函数通常位于code存储区不能在别的存储区运行函数默认定义为存储类型

code

135 bit的存储类错

bit标量的声明可能包含一个staticextern存储类registeralien类是无效的

136 变量用了void

void类型只允许作为一个不存在的返回值或一个函数的空参数列表void

func(void) 或和一个指针组合void *

138 Interrupt()不能接受或返回值

一个中断函数被定义了一个或多个正式的参数或一个返回值中断函数不能

包含调用参数或返回值

140 位在非法的存储空间

bit标量的定义可以包含可选的存储类型data 如果没有存储类型则默认为

data 因为位通常在内部数据存储区当试图对一个bit标量定义别的数据类型

时会产生本错误

141 临近标志语法错误期待别的标志

编译器所见的标志是错误的参考所显示的期待的内容

142 无效的基地址

一个sfrsbit声明的基地址是错误的有效的基地址范围在0x800xFF之间

如果用符号基地址^位号声明则基地址必须是8的倍数

143 无效的绝对位地址

sbit声明中的绝对位地址必须在0x800xFF之间

144 基地址^位号无效的位号

sbit声明中定义的位号必须在07之间

145 未知的sfr

146 无效sfr

一个绝对位基地址^位号的声明包含一个无效的基地址标识符基地址必

须是已经声明的sfr 任何别的名称是无效的

147 目标文件太大

单个目标文件不能超过65535 64K字节-1

149 struct/union包含函数成员

structunion不能包含一个函数类型的成员但是指向函数的指针是可以的

150 struct/union包含一个bit成员

一个union不能包含bit类型成员这是8051的结构决定的

151 struct/union自我关联

一个结构不能包含自己

152 位号超出位域

位域声明中指定的位号超过给定基类的位号

153 命名的位域不能为零

命名的位域为零只要未命名的位域允许为零

154 位域指针

指向位域的指针不允许

155 位域要求char/int

位域的基类要求charint unsigned charunsigned int类型也行

156 alien只允许对函数

157 alien函数带可变参数

存储类alien只对外部PL/M-51函数允许符号char *,… alien函数中是非

法的PL/M-51函数通常要求一个固定的参数表

158 函数包含未命名的参数

一个函数的参数列表定义包含一个未命名的抽象类型定义这个符号只允许在

函数原型中

159 void后面带类型

函数的原型声明可包含一个空参数列表例如int func(void) void后不

能再有类型定义

160 void无效

void类型只在和指针组合或作为一个函数的不存在的返回值中是合法的

161 忽视了正式参数

在一个函数内一个外部函数的声明用了一个没有类型标识符的参数名列表例

extern yylex(a,b,c);

180 不能指向一个函数

指向一个函数的类型是无效的尝试用指针指向一个函数

181 操作数不兼容

对给定的操作符至少一个操作数类型是无效的例如~float_type

183 左值不能修改

要修改的目标位于code存储区或有const属性因此不能修改

184 sizeof 非法操作数

sizeof操作符不能确定一个函数或位域的大小

185 不同的存储空间

一个目标声明的存储空间和前一个同样目标声明的存储空间不同

186 解除参照无效

一个内部编译器问题会产生本信息如果本错误重复出现请和技术支持接洽

187 不是一个左值

所需的参数必须是一个可修改的目标地址

188 未知目标大小

因为没有一个数组的维数或间接通过一个void指针一个目标的大小不能计

189 & bit/sfr非法

取地址符&不允许对bit目标或特殊函数寄存器sfr

190 & 不是一个左值

尝试建立一个指针指向一个未知目标

193 非法操作类型

193 ptr非法add/sub
193
bit的非法操作

193 错误操作数类型

当对一个给定的操作符用了非法的操作数类型时产生本错误例如无效的表

达式如bit*bit ptr+ptr ptr*anything 这个错误信息包括引起错误的操作

下面的操作对bit类型的操作数是可行的

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值