.error: #18:
6.error: #18: expected a ")"
如果是出现在c文件中, 多半是因为少了一个")",或者错误行有编译器不识别的字符
如果出现在头文件中,错误行又是一个函数声明,多半是因为在函数声明中有编译器不认识的字符
error: #20
error: #20: identifier "TIM2_IRQChannel" is undefined 谁能说说,哪里错了
你的固件库里的库文件没有添加进工程里面,所以出现未定义的情况。
TIM2_IRQChannel指定时器2的中断通道没有定义,其实在固件库对这些参数都有定义,宏定义代替了一串寄存器地址数据。需要将.C文件添加到工程文件中
warning: #1-D
main.c(7): warning: #1-D: last line of file ends without a newline
当使用keil编译时,弹出这样的警告信息:main.c(7): warning: #1-D: last line of file ends without a newline
这个是由于在main函数的“}”后,没有加回车。
只要在main函数的“}”后加回车键,此警告信息即可消除。
error:#65
...test_menu.c(27):error:#65:expected a ";"
分数送你了,问题在你回答之前已经解决了,头文件里的结构体定义里的最后一行没有加";" 如 NB menu{..};
Error: L6200E
Error: L6200E: Symbol temp multiply defined (by wenshidu.o and main.o).在编译的时候出现了这个问题,但是检查不出来,希望各位大侠帮帮忙
什么变量你给付了两次值
你看看是不是那个外部变量你又给赋值了
main.c申明,其他.c文件对应的.h文件中用extern引用
warning: #223-D
..\..\source\CCxx00_New.C(718): warning: #223-D: function "_NOP_" declared implicitly
在使用的文件中添加extern void _NOP_();既可
warning: #1295-D
..\..\include\CCxx00_New.h(20): warning: #1295-D: Deprecated declaration CC_XCal - give arg types
没有用形参 定时时用void CC_XCal(void);即可
Error: L6218E: Undefined symbol
.\Obj\output.axf: Error: L6218E: Undefined symbol FSMC_NORSRAMCmd (referred from tft_lcd.o).
.\Obj\output.axf: Error: L6218E: Undefined symbol FSMC_NORSRAMInit (referred from tft_lcd.o).
Target not created
请教高人,我该如何处理。
你看看tft_lcd里面有没有添加fsmcXXX.h之类的头文件,这个错误是说你使用的函数没有被定义。
一般只要添加相应的头文件即可
error: #101:
error: #101: has already been declared in the current scope
将
#ifndef __STM32F10x_LIB_H
#define __STM32F10x_LIB_H
#endif调整到最后!
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps_clip_image-20349.png
error: #247: function "DelayUs" has already been defined
有一个同名的 DelayUs类已经被定义过了
error: #109: expression must have (pointer-to-) function type
这个问题就是那19个error中的大部分,意思是表达式需要一个(指针)函数参数,我一开始以为是自己函数声明或者调用上的错误,但是看了下发现并没有 错,后来查了好久发现原来是犯了一个很低级的错误:将宏定义和函数名重名了。因为我一开始想的是每一个宏定义对应一个函数名,这样做起来就比较清晰,但是 我却很傻逼地将函数名每次直接复制到宏名,导致了这种蛋碎的结果。
warning: #61-D
warning: #68-D:
在KeilARM的LPCARM,存在(1<<31)编译警告问题
main.c(174): warning: #61-D: integer operation result is out of range
main.c(174): warning: #68-D: integer conversion resulted in a change of sign
由于编译器默认signed int即32位有符号整数类型,而1<<31实际为0x80000000,
这样就有可能改写了符号位(最高位)
依此类推,(2<<30),(3<<29)...等都会出现编译警告问题.
解决办法为: ((unsigned int)1<<31),((unsigned int)2<<30),...
warning: #1295-D:
warning: #1295-D: Deprecated declaration ShowSendTime - give arg types
解决方法:将void ShowSendTime()改为void ShowSendTime(void)
warning: #550-D:
warning: #550-D: variable "d" was set but never used
描述:变量'd'定义但从未使用,或者是,虽然这个变量你使用了,但编译器认为变量d所在的语句没有意义,编译器把它优化了.
解决:仔细衡量所定义的变量d是否有用,若是认定变量d所在语句有意义,那么尝试用volatile关键字修饰变量d,若是真的没有用,那么删除掉以释放可能的内存.
error: #159:
.error: #159: declaration is incompatible with previous "wr_lcd" (declared at line 40)
void a(void) //函数a的实体
{
b(); //调用函数b
}
void b(void) //函数b的实体
{
...
}
这样如果点编译,就会产生error: #159的错误,因为当函数a调用函数b时,发现在这之前都没有函数b的任何声明.
解决方法:在函数a调用函数b之前,对函数b进行声明,如:
void b(void); //对函数b进行声明
void a(void) //函数a的实体
{
b(); //调用函数b
}
void b(void) //函数b的实体
{
...
}
error: #70:
error: #70: incomplete type is not allowed
原来是重复定义了,包含了两次的psock的定义,所以才会出现这种情况。因为我发现psock和pt是一样定义的,但是pt是不报错的,所以我就试图删除头文件中include头文件的那一行,错误消除了,谢谢你了,还是实践出真知啊,有些时候不能死编,要思考,哈哈。
warning: #550-D:
1.warning: #550-D: variable "d" was set but never used
描述:变量'd'定义但从未使用,或者是,虽然这个变量你使用了,但编译器认为变量d所在的语句没有意义,编译器把它优化了.
解决:仔细衡量所定义的变量d是否有用,若是认定变量d所在语句有意义,那么尝试用volatile关键字修饰变量d,若是真的没有用,那么删除掉以释放可能的内存.
warning: #1-D:
2.warning: #1-D: last line of file ends without a newline
描述:文件最后一行不是新的一行.编译器要求程序文件的最后一行必须是空行,想了半天没想通为什么要这样.
解决:可以不理会.若是觉得出现警告不爽,那么在出现警告的文件的最后一行敲个回车,空出一行.
warning: #111-D:
3. warning: #111-D: statement is unreachable
描述:声明不可能到达.多出现在这种场合:
int main(void)
{
...
while(1) //无限循环,这在不使用操作系统的程序中最常见
{
...
}
return 0; //这句声明在正常情况下不可能执行到,编译器发出警告
}
解决:不理会.
warning: C3017W:
4. warning: C3017W: data may be used before being set
描述:变量'data'在使用前没有明确的赋值.如:
uint8 i,data; //定义变量i和data,二者都没有明确赋值
for ( i = 0; i < 8; i++) //变量'i'在语句中被赋值0
{
if ( IO1PIN & SO_CC2420 )
data |= 0x01; //变量'data'在使用前没有明确赋值,编译器发出警告
else
data &= ~0x01;
}
解决:应仔细衡量该变量的初始值是否为0,若是,可以不理会这个警告,因为MDK编译器在程序执行前,会将使用到的数据区初始化为0,但若是该变量的初始 值不应该是0,忽略这个警告可能会引起致命错误.这个警告应引起足够重视.应养成变量赋初值的习惯,好在有编译器给把关.
warning: #177-D:
5. warning: #177-D: variable "temp" was declared but never referenced
描述:变量'temp'进行了声明但没有引用.多出现在声明了一个变量,但却没有使用它,它和warning: #550-D: variable "temp" was set but never used不同之处在于temp从没有使用过.
解决:若是定义的变量确实没有用,删除掉;若是有用,则在程序中使用.
与该警告类似的还有 warning: #177-D: function "MACProcessBeacon" was declared but never referenced
warning: #940-D:
6. warning: #940-D: missing return statement at end of non-void function "DealwithInspect2"
描述:返回非空的函数"DealwithInspect2"的最后缺少返回值声明.如:
int DealwithInspect2(uint32 test)
{
...
...
...
//此处应该是return x;返回一个int型数据,若是没有返回值,编译器产生警告
}
.warning: #1295-D:
7..warning: #1295-D: Deprecated declaration lcd_init - give arg types
描述:在定义函数的时候,如果你写上函数参数,就会有这个警告,比如void timer_init(); 这里就没有形参,如果这样的话,编译器会给出警告.
error: #65:
1. error: #65: expected a ";"
描述:缺少分号.大多是漏忘';'.
解决:双击错误行,在定位到错误点的附近找到没加';'号的语句,加上分号.并不一定在定位到的错误行才却分号,可能是这行的上一行,也可能是下一行.
error: #65: error: #20
2. error: #65: expected a ";"和 error: #20: identifier "xxxx" is undefined一块出现,而且后面的error: #20错误可能一大堆
描述:这个错误对于第一次遇上的人来说绝对是个噩梦,当错误出现,满怀希望的双击错误提示,来到错误行时却愕然发现,错误行绝对没有错,于是找找错误行的 上一行,下一行,没有错误,再找上上行,下下行...让人无比郁闷的事情出现了:编译提示的所有错误行都不可能有错误出现.其实这最可能是你在.h文件声 明外部变量或者函数时,没有在声明语句的最后加分号!如果你有很多模块,如main.c,lcd.c,key.c...有很多头文件,如 lcd.h,key.h,若是在lcd.h文件声明函数时没有加分号,那么这种错误可能定为到main.c中,所以要检查所有头文件.
解决:仔细检查.h文件,将分号补上.
Error: L6200E:
3. Error: L6200E: Symbol flagu multiply defined (by uart0.o and main.o).
描述:变量(也是一种符号)flagu多处定义(在uart0.c中和main.c都定义了).通常错在全局变量定义重复.比如:在main.c中定义全局变量flagu:
uint8 flagu=0;
在uart0.c中也用到该变量,于是声明此变量,我通常都是先复制定义的变量再在变量前面加关键字extern修饰:
extern uint8 flagu=0;
然后编译,就会出现上面的连接错误,原因在于,我在uart0.c中是又定义了一个变量,而不是声明变量,因为我给变量赋了初值"flagu=0",这样就重复定义了变量flag.正确的声明方法是去掉赋值部分:
extern uint8 flagu;
解决办法:找到重复定义的变量,看情况修改一处.
error: #159:
4.error: #159: declaration is incompatible with previous "wr_lcd" (declared at line 40)
描述:在wr_lcd函数还没有声明之前就已经使用了.多出现在两种情况:第一种,wr_lcd函数体还没有写,就已经用到了它,这种情况多出现在写一个程序的大体结构中,只是简单写一下框架.第二种情况比较常见,函数a调用函数b,但函数b的函数体在函数a的下面:
void a(void) //函数a的实体
{
b(); //调用函数b
}
void b(void) //函数b的实体
{
...
}
这样如果点编译,就会产生error: #159的错误,因为当函数a调用函数b时,发现在这之前都没有函数b的任何声明.
解决方法:在函数a调用函数b之前,对函数b进行声明,如:
void b(void); //对函数b进行声明
void a(void) //函数a的实体
{
b(); //调用函数b
}
void b(void) //函数b的实体
{
...
}
error: #137:
5. error: #137: expression must be a modifiable lvalue
描述:表达式必须是一个可以修改的左值.主要出现在这种现象:
a=NUM;
NUM是一个数值或表达式,a为一个变量,但a被定义为像const这种不可更改的类型,导致NUM不能赋值给变量a.
解决方法:要么放弃赋值,要么修改变量属性.
error: #1113:
折腾了大半天,才搞明白一个空操作的指令
先在网上查有的说是__asm{NOP;},从intrins.h里调用,可犄角旮旯全找了,也没看到什么intrint.h的文件。如果直接用,就出现 error: #1113: Inline assembler not permitted when generating Thumb code
最后搜索这条错误,知道是因为__asm("指令");这种语法是内联汇编(inline assembly)的语法。而RMDK下,内联汇编仅支持ARM汇编语言,不支持Thumb或者Thumb-2汇编语言;但内嵌汇编器支持Thumb和Thumb-2。
__asm放到一个单独的子函数再被调用就没问题了
如下:
__asm void nop(void)
{
NOP
}
然后在之后的C代码中调用该函数:
void main()
{
...
nop();
...
}
keil MDK编译器警告和错误详解
工作后从单片机转成ARM,刚开始用ADS1.2编译器,用了一段时间,因为我接手的项目的老程序正是用ADS编译的,部门也大都在用.在学单片机的时候用的是keil c51编译器,ads和这个编译器在易用性上真是无法比较.后来渐渐知道keil已经被arm公司收购,现在keil MDK成为了arm官方编译器,所以决定重新投奔keil,利用平时的时间,将原程序重新用mdk编译.mdk的优点就没必要说了,在这里把平时遇到的编译器给出的警告和错误信息给出详解,希望给初学者一点帮助,发现错误,需要补充的欢迎留言.
致命错误
致命错误立即终止编译这些错误通常是命令行指定的无效选项的结果当编译器不
能访问一个特定的源包含文件时也产生致命错误
致命错误信息采用下面的格式
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.
下面说明Action和Error中可能的内容
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控制只允许数字0到6,值
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 无效存储类
一个目标用一个无效的存储空间标识符声明如果一个目标在一个函数外用存
储类auto或register声明就会产生本错误
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/data不允许
函数通常位于code存储区不能在别的存储区运行函数默认定义为存储类型
code
135 bit的存储类错
bit标量的声明可能包含一个static或extern存储类register或alien类是无效的
136 变量用了void
void类型只允许作为一个不存在的返回值或一个函数的空参数列表void
func(void) 或和一个指针组合void *
138 Interrupt()不能接受或返回值
一个中断函数被定义了一个或多个正式的参数或一个返回值中断函数不能
包含调用参数或返回值
140 位在非法的存储空间
bit标量的定义可以包含可选的存储类型data 如果没有存储类型则默认为
data 因为位通常在内部数据存储区当试图对一个bit标量定义别的数据类型
时会产生本错误
141 临近标志语法错误期待别的标志…
编译器所见的标志是错误的参考所显示的期待的内容
142 无效的基地址
一个sfr或sbit声明的基地址是错误的有效的基地址范围在0x80到0xFF之间
如果用符号基地址^位号声明则基地址必须是8的倍数
143 无效的绝对位地址
sbit声明中的绝对位地址必须在0x80到0xFF之间
144 基地址^位号无效的位号
sbit声明中定义的位号必须在0到7之间
145 未知的sfr
146 无效sfr
一个绝对位基地址^位号的声明包含一个无效的基地址标识符基地址必
须是已经声明的sfr 任何别的名称是无效的
147 目标文件太大
单个目标文件不能超过65535 64K字节-1
149 struct/union包含函数成员
struct或union不能包含一个函数类型的成员但是指向函数的指针是可以的
150 struct/union包含一个bit成员
一个union不能包含bit类型成员这是8051的结构决定的
151 struct/union自我关联
一个结构不能包含自己
152 位号超出位域
位域声明中指定的位号超过给定基类的位号
153 命名的位域不能为零
命名的位域为零只要未命名的位域允许为零
154 位域指针
指向位域的指针不允许
155 位域要求char/int
位域的基类要求char或int unsigned char和unsigned 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类型的操作数是可行的
� 赋值=
� OR/复合OR | |=
� AND/复合AND & &=
� XOR/复合XOR ^ ^=
� bit比较= = !=
� 取反~
bit操作数可和别的数据类型在表达式中混用在这种情况类型转换自动执行
194 * 间接指向一个未知大小的目标
间接操作符*不能和void指针合用因为指针所指的目标的大小是未知的
195 * 间接非法
*操作符不能用到非指针参数
196 存储空间可能无效
转换一个常数到一个指针常数产生一个无效的存储空间例如 char
*p=0x91234
198 sizeof返回零
sizeof操作符返回一个零
199 ->’的左边要求struct/union指针
->操作符的左边参数必须是一个struct指针或一个union指针
200 . 左边要求struct/union
.操作符的左边参数要求必须是struct或union类型
201 未定义的struct/union
给定的struct或union名是未知的
202 未定义的标识符
给定的标识符是未定义的
203 错误的存储类参考名
本错误表示编译器的一个问题如果重复出现请接洽技术支持
204 未定义的成员
给定的一个struct或union成员名是未定义的
205 不能调用一个中断函数
一个中断函数不能象一个正常函数一样调用中断的入口和退出代码是特殊
的
207 参数列表声明为void
参数列表声明为void的函数不能从调用者接收参数
208 太多的实参
函数调用包含太多的实参
209 太少的实参
调用函数包含太少的实参
210 太多的嵌套调用
函数的嵌套调用不能超过10级
211 调用不是对一个函数
一个函数的调用项不是对一个函数或函数指针求值
212 间接调用寄存器的参数不匹配
通过一个指针的间接函数调用不包含实际的参数一个例外是当所有的参数可
以通过寄存器传递这是由于Cx51所用的传递参数的方法被调用的函数名
必须是已知的因为参数写到被调用函数的数据段但是对间接调用来说
被调用函数的名称是未知的
213 赋值符的左边不是一个左值
赋值符的左边要求一个可修改目标的地址
214 非法指针转换
bit float或集合类型的目标不能转换为指针
215 非法类型转换
struct/union/void不能转换为任何别的类型
|