Keil MDK 编译器警告和错误详解
Keil MDK 编译器是一款功能强大且流行的编译器,在软件开发过程中,编译器给出的警告和错误信息对开发者的帮助非常大。下面将详细解释 Keil MDK 编译器中常见的警告和错误信息,帮助初学者更好地理解和解决这些问题。
1. Warning: #550-D: variable "d" was set but never used
描述:变量“d”定义但从未使用,或者是,虽然这个变量你使用了,但编译器认为变量“d”所在的语句没有意义,编译器把它优化了。
解决:仔细衡量所定义的变量“d”是否有用,若是认定变量“d”所在语句有意义,那么尝试用volatile关键字修饰变量“d”,若是真的没有用,那么删除掉以释放可能的内存。
2. Warning: #1-D: last line of file ends without a newline
描述:文件最后一行不是新的一行。编译器要求程序文件的最后一行必须是空行,想了半天没想通为什么要这样。
解决:可以不理会。若是觉得出现警告不爽,那么在出现警告的文件的最后一行敲个回车,空出一行。
3. Warning: #111-D: statement is unreachable
描述:声明不可能到达。多出现在这种场合:
```c
int main(void){
...
while(1) // 无限循环,这在不使用操作系统的程序中最常见
{
...
}
return 0; // 这句声明在正常情况下不可能执行到,编译器发出警告
}
```
解决:不理会。
4. Warning: C3017W: data may be used before being set
描述:变量“data”在使用前没有明确的赋值。
```c
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,忽略这个警告可能会引起致命错误。这个警告应引起足够重视。应养成变量赋初值的习惯,好在有编译器给把关。
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。
6. Warning: #940-D: missing return statement at end of non-void function "DealwithInspect2"
描述:返回非空的函数“DealwithInspect2”的最后缺少返回值声明。
```c
int DealwithInspect2(uint32 test){
.........
// 此处应该是return x; 返回一个int型数据,若是没有返回值,编译器产生警告
}
```
7. Warning: #1295-D: Deprecated declaration lcd_init - give arg types
描述:在定义函数的时候,如果你写上函数参数,就会有这个警告,比如`void timer_init();`这里就没有形参,如果这样的话,编译器会给出警告。
Error: #65: expected a ";"
描述:缺少分号。大多是漏忘';'。
解决:双击错误行,在定位到错误点的附近找到没加';'号的语句,加上分号。并不一定在定位到的错误行才却分号,可能是这行的上一行,也可能是下一行。
Keil MDK 编译器的警告和错误信息对开发者的帮助非常大,了解这些信息可以帮助开发者更好地编写代码,提高程序的可靠性和可维护性。
- 1
- 2
前往页