问题代码:
void Init_sys()
{
Set_HC573(0, 0x00);
Set_HC573(4, 0xff);
Set_HC573(5, 0x00);
DisplaySMG_All(0xff);
unsigned char i = 0;
for (i = 0; i < 30; i++)
{
Read_ds18b20_adc();
DelaySMG(10000);
}
}
//这段代码keil报错但是下面这段不会
void Init_sys()
{
unsigned char i = 0;
Set_HC573(0, 0x00);
Set_HC573(4, 0xff);
Set_HC573(5, 0x00);
DisplaySMG_All(0xff);
for (i = 0; i < 30; i++)
{
Read_ds18b20_adc();
DelaySMG(10000);
}
}
遇到的这个问题与C语言的变量作用域和声明位置相关。在C标准中,特别是C90标准(ANSI C)中,所有的变量声明必须在代码块(如函数内部)的开始处进行,紧接着块的左大括号之后,且在任何可执行语句之前。这是早期C语言标准的一个限制。
第一段代码中,变量`i`的声明出现在了一些函数调用之后,这违反了C90标准中的这一规定:
void Init_sys()
{
Set_HC573(0, 0x00); // 可执行语句
Set_HC573(4, 0xff); // 可执行语句
Set_HC573(5, 0x00); // 可执行语句
DisplaySMG_All(0xff); // 可执行语句
unsigned char i = 0; // 变量声明不在代码块的开始处
for (i = 0; i < 30; i++)
{
Read_ds18b20_adc();
DelaySMG(10000);
}
}
第二段代码中,`i`是在函数的开头、任何可执行语句之前声明的,这符合C90标准,因此不会报错:
void Init_sys()
{
unsigned char i = 0; // 变量声明在代码块的开始处
Set_HC573(0, 0x00);
Set_HC573(4, 0xff);
Set_HC573(5, 0x00);
DisplaySMG_All(0xff);
for (i = 0; i < 30; i++)
{
Read_ds18b20_adc();
DelaySMG(10000);
}
}
随着C99标准的推出,这一限制被放宽,允许在代码块中的任何位置声明变量,更接近于其他现代编程语言的风格。然而,如果您使用的编译器默认遵循C90标准或者特别设置为遵循C90标准(如某些版本的Keil),就会遇到这种问题。
解决方法:
- 将所有变量声明移至代码块(例如函数)的开始处,确保它们在任何可执行语句之前。
- 如果可能,配置您的编译器以使用C99或更现代的标准,这样您就可以在代码块中任何位置声明变量。对于Keil,您可以查看编译器设置以了解如何更改C语言标准的遵循情况。
选择哪种解决方法取决于您对代码的需求以及编译器的兼容性。对于跨平台或保持代码最大程度兼容性的项目,遵循C90标准(即在所有可执行语句之前声明变量)是一种安全的做法。