Keil编程中变量定义在函数体不同位置编译下载出错的原因

问题代码:

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标准(即在所有可执行语句之前声明变量)是一种安全的做法。

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Caihua_X

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值