标题: 为什么在单片机C语言程序预处理阶段对位变量进行赋值会编译不过呢? [打印本页]

作者: 忆1709    时间: 2021-1-20 13:57
标题: 为什么在单片机C语言程序预处理阶段对位变量进行赋值会编译不过呢?
为什么在程序预处理阶段对位变量进行赋值会编译不过呢?
比如下方程序,如果led=0;就提示错误,sbit定义的位变量不能在函数外赋值吗?
提示“1602time.c(3): error C231: 'led': redefinition”
#include <reg51.h>
sbit led=P1^0;
//led=0;
void main()
{
while(1)
{
}
}

作者: munuc_w    时间: 2021-1-20 16:09
提示行写的很明白,不是“不能赋值”,是重复定义了!在仔细检查一下。
作者: wulin    时间: 2021-1-20 16:47
编译器判断为重复定义,正确写法:

#include <reg51.h>

sbit led=P1^0;

void main()
{
        led=0;
        while(1)
        {
        }
}
作者: 忆1709    时间: 2021-1-20 20:37
wulin 发表于 2021-1-20 16:47
编译器判断为重复定义,正确写法:

#include

谢谢,我知道正确写法是这样的,但没弄明白的是,这个全局变量赋值,为何在函数内不提示重复,放函数外面就会提示重复。
作者: 忆1709    时间: 2021-1-20 20:38
munuc_w 发表于 2021-1-20 16:09
提示行写的很明白,不是“不能赋值”,是重复定义了!在仔细检查一下。

为何放函数内就不提示“重复定义”了呢?
作者: wulin    时间: 2021-1-21 06:22
忆1709 发表于 2021-1-20 20:37
谢谢,我知道正确写法是这样的,但没弄明白的是,这个全局变量赋值,为何在函数内不提示重复,放函数外面 ...

sbit led=P1^0;语句中的led并不是一个位变量名,而是端口P1.0的自定义名称。led=0;就是对端口的赋值操作,那么只能在函数内进行。也许有其它编译器可以例外,但Kei不行。这没有什么理由可讲,其创始人就是这么规定的。
作者: HC6800-ES-V2.0    时间: 2021-1-21 08:15
忆1709 发表于 2021-1-20 20:37
谢谢,我知道正确写法是这样的,但没弄明白的是,这个全局变量赋值,为何在函数内不提示重复,放函数外面 ...

51C程序是从main()的第一句开始的,你这个赋值放在main()之外,怎么运行它呢?
这样写是一样的错误:
#include <reg51.h>
unsigned char led;
led=0;
void main()
{
        while(1)
        {
        }
}
足以说明问题了。
作者: 忆1709    时间: 2021-1-21 09:32
本帖最后由 忆1709 于 2021-1-21 09:33 编辑
HC6800-ES-V2.0 发表于 2021-1-21 08:15
51C程序是从main()的第一句开始的,你这个赋值放在main()之外,怎么运行它呢?
这样写是一样的错误:
# ...

但如果这样写,就不会报错且运行正常。
#include <reg51.h>
unsigned char led=1;
//led=1;
void main()
{
        while(1)
        {
        
        }
}
作者: HC6800-ES-V2.0    时间: 2021-1-22 20:52
忆1709 发表于 2021-1-21 09:32
但如果这样写,就不会报错且运行正常。
#include
unsigned char led=1;

是啊,定义申明时赋初值,是没有问题的。
因为定义申明的实质,是分配“容量”,同时在这个空间中给个值,是可以的嘛
作者: 370894249    时间: 2021-1-25 11:55
LED不能既是变量又是常量,可以在主程序中赋值。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1