《C51语法和语义错误.doc》由会员分享,可在线阅读,更多相关《C51语法和语义错误.doc(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、语法和语义错误语法和语义错误一般出现在源程序中它们确定实际的编程错误当遇到这些错误时编译器尝试绕过错误继续处理源文件当遇到更多的错误时编译器输出另外的错误信息但是不产生OBJ文件语法和语义错误在列表文件中生成一条信息这些错误信息用下面的格式* ERROR number IN LINE line OF file:error message这里number 错误号line 对应源文件或包含文件的行号file 产生错误的源或包含文件名error message 对错误的叙述说明下表按错误号列出了语法和语义错误错误信息列出了主要说明和可能的原因和改正号错误信息和说明100 跳过不可打印字符0x?在源文
2、件中发现一个非法字符注意不检查注释中的字符101 字符串没结束一个字符串没有用双引号终止102 字符串太长一个字符串不能超过4096个字符用串联符号 在逻辑上可延长字符串超过4096个字符这个模式的行终止符在词汇分析时是连续的103 无效的字符常数一个字符常数的格式无效符号c 是无效的除非c是任何可打印的ASCII字符125 声明符太复杂20一个目标的声明可包含最多20个类型修饰符 * 这号错误信息和说明126 类型堆栈下溢类型声明堆栈下溢这个错误通常是错误125的副产品127 无效存储类一个目标用一个无效的存储空间标识符声明,如果一个目标在一个函数外用存储类auto或register声明就会
3、产生本错误129 在标记前缺少;本错误通常表示前一行缺少分号当出现本错误时编译器会产生很多错误信息130 值超出范围在一个using或interrupt标识符后的数字参数是无效的,using标识符要求一个0到3之间的寄存器组号,interrupt标识符要求一个0到31之间的中断矢量号131 函数参数重复一个函数有相同的参数名,在函数声明中参数名必须是唯一的132 没在正式的参数列表一个函数的参数声明用了一个名称没在参数名列表中例如char function(v0,v1,v2)char *v0,*v1,*v5;/* v5没在正式列表中 */* */134 函数的xdata/idata/pdata
4、/data不允许函数通常位于code存储区不能在别的存储区运行,函数默认定义为存储类型code135 bit的存储类错bit标量的声明可能包含一个static或extern存储类register或alien类是无效的136 变量用了voidvoid类型只允许作为一个不存在的返回值或一个函数的空参数列表voidfunc(void) 或和一个指针组合void *138 Interrupt()不能接受或返回值一个中断函数被定义了一个或多个正式的参数或一个返回值中断函数不能包含调用参数或返回值140 位在非法的存储空间bit标量的定义可以包含可选的存储类型data 如果没有存储类型则默认为data 因
5、为位通常在内部数据存储区当试图对一个bit标量定义别的数据类型时会产生本错误141 临近标志语法错误期待别的标志编译器所见的标志是错误的参考所显示的期待的内容142 无效的基地址一个sfr或sbit声明的基地址是错误的有效的基地址范围在0x80到0xFF之间如果用符号基地址位号声明则基地址必须是8的倍数143 无效的绝对位地址sbit声明中的绝对位地址必须在0x80到0xFF之间144 基地址位号无效的位号sbit声明中定义的位号必须在0到7之间145 未知的sfr146 无效sfr一个绝对位基地址位号的声明包含一个无效的基地址标识符基地址必须是已经声明的sfr 任何别的名称是无效的147 目
6、标文件太大单个目标文件不能超过65535 64K字节-1149 struct/union包含函数成员struct或union不能包含一个函数类型的成员但是指向函数的指针是可以的150 struct/union包含一个bit成员一个union不能包含bit类型成员这是8051的结构决定的151 struct/union自我关联一个结构不能包含自己152 位号超出位域位域声明中指定的位号超过给定基类的位号153 命名的位域不能为零命名的位域为零只要未命名的位域允许为零154 位域指针指向位域的指针不允许155 位域要求char/int位域的基类要求char或int unsigned char和un
7、signed 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 忽视了正式参数在一个函数内一个外部函数的声明用了一个没有
8、类型标识符的参数名列表例如extern yylex(a,b,c);号错误信息和说明180 不能指向一个函数指向一个函数的类型是无效的尝试用指针指向一个函数181 操作数不兼容对给定的操作符至少一个操作数类型是无效的例如float_type183 左值不能修改要修改的目标位于code存储区或有const属性因此不能修改184 sizeof 非法操作数sizeof操作符不能确定一个函数或位域的大小185 不同的存储空间一个目标声明的存储空间和前一个同样目标声明的存储空间不同186 解除参照无效一个内部编译器问题会产生本信息如果本错误重复出现请和技术支持接洽187 不是一个左值所需的参数必须是一个可
9、修改的目标地址188 未知目标大小因为没有一个数组的维数或间接通过一个void指针一个目标的大小不能计算189 & 对bit/sfr非法取地址符& 不允许对bit目标或特殊函数寄存器sfr190 & 不是一个左值尝试建立一个指针指向一个未知目标193 非法操作类型193 对ptr非法add/sub193 对bit的非法操作193 错误操作数类型当对一个给定的操作符用了非法的操作数类型时产生本错误例如无效的表达式如bit*bit ptr+ptr 或ptr*anything 这个错误信息包括引起错误的操作符下面的操作对bit类型的操作数是可行的 赋值= OR
10、/复合OR | |= AND/复合AND & &= XOR/复合XOR = bit比较= = != 取反bit操作数可和别的数据类型在表达式中混用在这种情况类型转换自动执行194 * 间接指向一个未知大小的目标间接操作符*不能和void指针合用因为指针所指的目标的大小是未知的195 * 间接非法*操作符不能用到非指针参数号错误信息和说明196 存储空间可能无效转换一个常数到一个指针常数产生一个无效的存储空间例如 char*p=0x91234198 sizeof返回零sizeof操作符返回一个零199 -的左边要求s
11、truct/union指针-操作符的左边参数必须是一个struct指针或一个union指针200 . 左边要求struct/union.操作符的左边参数要求必须是struct或union类型201 未定义的struct/union给定的struct或union名是未知的202 未定义的标识符给定的标识符是未定义的203 错误的存储类参考名本错误表示编译器的一个问题如果重复出现请接洽技术支持204 未定义的成员给定的一个struct或union成员名是未定义的205 不能调用一个中断函数一个中断函数不能象一个正常函数一样调用中断的入口和退出代码是特殊的207 参数列表声明为void参数列表声明为
12、void的函数不能从调用者接收参数208 太多的实参函数调用包含太多的实参209 太少的实参调用函数包含太少的实参210 太多的嵌套调用函数的嵌套调用不能超过10级211 调用不是对一个函数一个函数的调用项不是对一个函数或函数指针求值212 间接调用寄存器的参数不匹配通过一个指针的间接函数调用不包含实际的参数一个例外是当所有的参数可以通过寄存器传递这是由于Cx51所用的传递参数的方法被调用的函数名必须是已知的因为参数写到被调用函数的数据段但是对间接调用来说被调用函数的名称是未知的213 赋值符的左边不是一个左值赋值符的左边要求一个可修改目标的地址214 非法指针转换bit float或集合类型
13、的目标不能转换为指针215 非法类型转换struct/union/void不能转换为任何别的类型216 标号用在非数组中或维数超出一个数组引用包含太大的维数或目标不是一个数组217 非整数索引一个数组的维数表达式必须是char unsigned char int 或unsigned int类型别的类型都是非法的218 控制表达式用了void类型在一个while for 或do的限制表达式中不能用类型void219 long常数缩减为int一个常数表达式的值必须能用一个int类型表示220 非法常数表达式期望一个常数表达式目标名变量或函数不允许出现在常数表达式中221 非常数case/dim表达
14、式一个case或一个维数 必须是一个常数表达式222 被零除223 被零取模编译器检测到一个被零除或取模225 表达式太复杂需简化一个表达式太复杂必须分成两个或多个子表达式226 重复的struct/union/enum标记一个struct union 或enum名早已定义227 表示一个union标记一个union名称早已定义为别的类型228 表示一个struct标记一个struct名早已定义为别的类型229 表示一个enum标记一个enum名早已定义为别的类型230 未知的struct/union/enum标记指定的struct union 或enum名未定义231 重复定义指定的名称已被
15、定义232 重复标号指定的标号已定义233 未定义标号表示一个标号未定义有时候这个信息会在实际的标号的几行后出现这是所用的未定义标号的搜索方法引起的234 堆栈范围溢出31超过了最多31个嵌套块超出的嵌套块被忽略235 参数 不同类型函数声明的参数类型和函数原型中的不同236 参数列表的长度不同函数声明中的参数数目和函数原型中的不同237 函数早已定义试图声明一个函数体两次238 重复成员239 重复参数试图定义一个已存在的struct成员或函数参数240 超出128个局部bit在一个函数内不能超过128个bit标量241 auto段太大局部目标所需的空间超过模式的极限最大的段大小定义如下SM
16、ALL 128字节COMPACT 256字节LARGE 65535字节242 太多的初始化软件初始化软件的数目超过初始化目标的数量243 字符串超出范围字符串中的字符数目超出字符串初始化的数目244 不能初始化错误的类型或类试图初始化一个bit或sfr245 未知的pragma 跳过本行#pragma状态未知所以整行被忽略246 浮点错误当一个浮点参数超出32位的范围就产生本错误32位IEEE值的范围是1.E-38到3.E+38247 非地址/常数初始化一个有效的初始化表达式必须是一个常数值求值或一个目标名加或减去一个常数248 集合初始化需要大括号给定struct或union初始化缺少大括号
17、249 段 段太大编译器检测到一个数据段太大一个数据段的最大的大小由存储空间决定250 esc 值超过255一个字符串常数中的转义序列超过有效值范围最大值是255252 非法八进制数指定的字符不是一个有效的八进制数252 主要控制放错地方行被忽略主要控制必须被指定在C模块的开头在任何#include命令或声明前号错误信息和说明253 内部错误ASMGENCLASS在下列情况下出现本错误 一个内在函数例如_testbit_ 被错误激活这种情况是在没有函数原型存在和实参数目或类型错误对这种原因必须使用合适的声明文件INTRINS.H STRING.H 参考第八章中的instri
18、nsic函数 Cx51确认一个内部一致性问题请接洽技术支持255 switch表达式有非法类型在一个switch表达式没有合法的数据类型256 存储模式冲突一个包含alien属性的函数只能包含模式标识符small 函数的参数必须位于内部数据区这适用于所有的外部alien声明和alien函数例如alien plm_func(char c) large 产生错误256257 alien函数不能重入一个包含alien属性的函数不能同时包含reentrant属性函数参数不能跳过虚拟堆栈传递这适用于所有的外部alien声明和alien函数258 struct/union成员的存储空间
19、非法非法空间的参数被忽略一个结构的成员或参数不能包含一个存储类型标识符但指针所指的目标可能包含一个存储类型例如struct vpchar code c;int xdata i; ;产生错误258struct v1char c;int xdata *i; ;是正确的struct声明259 指针不同的存储空间一个空指针被关联到别的不同存储空间的空指针例如char xdata *p1;char idata *p2;p1 = p2; /* 不同的存储空间 */260 指针断开一个空指针被关联到一些常数值这些值超过了指针存储空间的值范围例如char idata *p1 = 0x1234; /* 结果是0
20、x34 */号错误信息和说明261 reentrant()内有bit一个可重入属性的函数的声明中不能包含bit目标例如int func1(int i1) reentrant bit b1,b2; /* 不允许 */return(i1-1);262 using/disable 不能返回bit值用using属性声明的函数和禁止中断#pragma disable 的函数不能返回一个bit值给调用者例如bit test(void) using 3bit b0;return(b0);产生错误262263 保存/恢复堆栈保存溢出/下溢#pragma save的最大嵌套深度是八级堆栈的pragma save
21、和restore工作根据LIFO 后进先出规则264 内在的 声明/激活错误本错误表示一个内在的函数错误定义参数数目或省略号如果用标准的.H文件就不会产生本错误确认使用了Cx51所有的.H文件不要尝试对内在的库函数定义自己的原型265 对非重入函数递归调用非重入函数不能被递归调用因为这样会覆盖函数的参数和局部数据如果需要递归调用需声明函数为可重入函数267 函数定义需要ANSI类型的原型一个函数被带参数调用但是声明是一个空的参数列表原型必须有完整的参数类型这样编译器就可能通过寄存器传递参数和适合应用的调用机制268 任务定义错误任务ID/优先级/using任务声明错误271 asm/endas
22、m 控制放错地方asm和endasm声明不能嵌套endasm要求一个汇编块前面用asm开头例如#pragma asm.汇编指令.#pragma endasm号错误信息和说明272 asm 要求激活SRC控制在一个源文件中使用asm和endasm 要求文件用SRC控制编译那么编译器就会生成汇编源文件然后可以用A51汇编273 asm/endasm 在包含文件中不允许在包含文件中不允许asm和endasm 为了调试在包含文件不能有任何的可执行代码274 非法的绝对标识符绝对地址标识符对位目标函数和局部函数不允许地址必须和目标的存储空间一致例如下面的声明是无效的因为间接寻址的范围是0x00到0xFF
23、idata int _at_ 0x1000;278 常数太大当浮点参数超出32位的浮点值范围就产生本错误32位IEEE值的范围是1.E-38到3.E+38279 多次初始化试图多次初始化一个目标280 没有使用符号/标号/参数在一个函数中声明了一个符号标号或参数但没有使用281 非指针类型转换为指针引用的程序目标不能转换成一个指针282 不是一个SFR引用本函数调用要求一个SFR作为参数283 asmparms 参数不适合寄存器参数不适合可用的CPU寄存器284 在可覆盖空间函数不再可重入一个可重入函数包含对局部变量的明确的存储类型标识符函数不再完全可重入300 注释未结束一个注释没有一个结束
24、符*/301 期望标识符一个预处理器命令期望一个标识符302 误用#操作符字符操作符# 没有带一个标识符303 期望正式参数字符操作符# 没有带一个标识符表示当前所定义的宏的一个正式参数名304 错误的宏参数列表宏参数列表没有一个大括号逗号分开的标识符列表305 string/char 常数未结束一个字符串活字符常数是无效的典型的后引号丢失306 宏调用未结束预处理器在收集和扩展一个宏调用的实际的参数时遇到输入文件的结尾307 宏名称参数计算不匹配在一个宏调用中实际的参数数目和宏定义的参数数目不匹配本错误表示指定了太少的参数308 无效的整数常数表达式一个if/elif 命令的数学表达式包含一
25、个语法错误309 错误或缺少文件名在一个include 命令中的文件名参数是无效的或没有310 条件嵌套过多20源文件包含太多的条件编译嵌套命令最多允许20 级嵌套311 elif/else 控制放错地方312 endif 控制放错地方命令elif else 和endif 只有在if ifdef 或ifndef 命令中是合法的313 不能清除预定义的宏名称试图清除一个预定义宏用户定义的宏可以用#undef 命令删除预定义的宏不能清除314 #命令语法错误在一个预处理器命令中字符# 必须跟一个新行或一个预处理器命令名例如if/define/ifdef 315 未知的#命令名称预处理器命令是未知的
26、316 条件未结束到文件结尾endif 的数目和if 或ifdef 的数目不匹配318 不能打开文件文件名指定的文件不能打开319 文件不是一个磁盘文件指定的文件不是一个磁盘文件文件不能编辑320 用户自定义的内容本错误号未预处理器的#error 命令保留#error 命令产生错误号320送出用户定义的错误内容终止编译器生成代码321 缺少在一个include 命令的文件名参数中缺少结束符例如#includestdio.h325 正参名称重复一个宏的正参只能定义一次326 宏体不能以# 开始或结束# 不能是一个宏体的开始或结束327 宏宏名超过50 个参数每个宏的参数数目不能超过50警告警告产
27、生潜在问题的信息他们可能在目标程序的运行过程中出现警告不妨碍源文件的编译警告在列表文件中生成信息警告信息用下面的格式* WARNING number IN LINE line OF file: warning message这里number 错误号line 在源文件或包含文件中的对应行号file 错误产生的源或包含文件名warning message 警告的内容下表按号列出了警告警告信息包括一个主要的内容和可能的原因和纠正措施173 缺少返回表达式一个函数返回一个除了int 类型以外的别的类型的值必须包含一个返回声明包括一个表达式为了兼容旧的程序对返回一个int 值的函数不作检查182 指针指
28、向不同的目标一个指针关联了一个不同类型的地址185 不同的存储空间一个目标声明的存储空间和前面声明的同样目标的存储空间不同196 存储空间可能无效把一个无效的常数值分配给一个指针无效的指针常数是long 或unsigned long 编译器对指针采用24 位3 字节低16 位代表偏移高8 位代表选择的存储空间198 sizeof 返回零一个目标的大小计算结果为零如果目标是外部的或如果一个数组的维数没有全知道则值是错误的206 缺少函数原型因为没有原型声明被调用的函数是未知的调用一个未知的函数通常是危险的参数的数目和实际要求不一样如果是这种情况函数调用不正确没有函数原型编译器不能检查参数的数目和
29、类型要避免这种警告应在程序中包含函数的原型函数原型必须在函数被调用前声明注意函数定义自动生成原型209 实参太少在一个函数调用中包含太少的实参219 long 常数被缩减为int一个常数表达式的值必须能被一个int 类型所表示245 未知的pragma 本行被忽略#pragma 声明是未知的因此整行程序被忽略258 struct/union 成员的存储空间方法参数的存储空间被忽略一个结构的成员或一个参数不能指定存储类型但是指针所指的目标可以包含一个存储类型例如struct vp char code c;int xdata i; ;产生警告258struct v1 char c;int xdat
30、a *i; ;对struct 是正确的声明259 指针不同的存储空间两个要比较的指针没有引用相同的存储类型的目标260 指针折断把一个指针转换为一个更小偏移区的指针转换会完成但大指针的偏移会折断来适应小指针261 bit 在重入函数一个reentrant 函数不能包含bit 因为bit 标量不能保存在虚拟堆栈中265 名称对非重入函数递归调用发现对一个非重入函数直接递归这可能是故意的但对每个独立的情况进行功能性检查通过生成的代码间接递归由连接/定位器检查号警告信息和说明271 asm/endams 控制放错地方asm 和endasm 不能嵌套endasm 要求一个以asm 声明开头的汇编块例如
31、#pragma asm.汇编指令.#pragma endasm275 表达式可能无效编译器检测到一个表达式不生成代码例如void test(void) int i1,i2,i3;i1,i2,i3; /* 死表达式 */i1 i3; /* 结果未使用 */276 常数在条件表达式编译器检测到一个条件表达式有一个常数值在大多数情况下是一个输入错误例如void test(void) int i1,i2,i3;if( i1 = 1) i2 = 3; /* 常数被赋值 */while( i3 = 2); /* 常数被赋值 */277 指针有不同的存储空间一个typedef 声明的存储空间冲突例如type
32、def char xdata XCC; /* 存储空间xdata */typedef XCC idata PICC; /* 存储空间冲突 */280 符号/标号未使用一个符号或标号定义但未使用307 宏名称参数计算不匹配一个宏调用的实参的数目和宏定义的参数数目不匹配表示用了太多的的参数过剩的参数被忽略317 宏名称重新定义无效一个预定义的宏不能重新定义或清除参考138 页的预定义宏常数322 未知的标识符在一个#if 命令行的标识符未定义等效为FALSE323 期望新行发现多余字符一个#命令行正确但包含多余的非注释字符例如#include foo号警告信息和说明324 期望预处理器记号期望一个预处理器记号但输入的是一个新行例如#line 这里缺少#line 命令的参数