wangxiangtan 发表于 2025-1-11 11:18:24

小白学单片机记录之关键字data、bit,奇怪的编译问题

在标准C/C++、C#里面data都不是关键字,但在嵌入式C里面data是关键字;
在C#里面byte是关键字,但在标准C/C++、嵌入式C里面byte都不是关键字;
靠着C#的惯性早上抄代码的时候用了data当变量,结果当然是编译不通过。
但是机缘巧合我给他弄得编译过了,哈哈哈,当然编译过了没用,程序应该还是不会正常执行的。

一、关键字 data
这是单片机C语言中特有的关键字,表示数据存储区,标准C语言中是没有的,如
int data x ;
表示将 x 定义在数据存储区。
二、关键字 bit
bit 在C51里面类似C语言的bool,bit定义的是一个位数据类型,只能为0或1两个值
①bit是C51扩展的变量类型
bit和int、char之类的差不多,只不过char是8位,bit是1位,都是变量,编译器在编译过程中分配随机的地址,bit只有0和1两个值
②bit位标量
bit位标量是C51编译器的一种扩充类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组,它的值是一个二进制位,不是0就是1,也类似于高级语言中的true和false。
一、byte不是关键字,随便当变量用编译正常通过:


二、data 是关键字,当变量用编译不通过:


三、如何把data当变量用还能编译通过呢?这样操作:
在头文件.h里面最后留前半个注释符/*,在.c最后加上后半个注释符*/,编译就通过了:


咋发现的呢?我在VSCode里面定义header模板的时候漏了最后的“*/”,
然后用data当变量的时候,编译后报错是“unterminated comment”,就是注释没结束,
然后我在.c里面最后加上*/就编译通过了

_奶咖君_ 发表于 2025-1-11 13:31:40

没有什么嵌入式C,,,这些非C语言标准的关键字要看编译器。。。换一个编译器,可能就又是一套关键字,,

wangxiangtan 发表于 2025-1-11 16:11:02

_奶咖君_ 发表于 2025-1-11 13:31
没有什么嵌入式C,,,这些非C语言标准的关键字要看编译器。。。换一个编译器,可能就又是一套关键字,, ...

我次奥,到底有多少非C标准的C语言

wangxiangtan 发表于 2025-1-11 16:31:40

_奶咖君_ 发表于 2025-1-11 13:31
没有什么嵌入式C,,,这些非C语言标准的关键字要看编译器。。。换一个编译器,可能就又是一套关键字,, ...

搜了半天没找到第三中非C语言标准的扩展C语言,

网上大多数人的认知就是标准C和嵌入式C,
大佬指点一下,除了标准C、Keil C,还有哪种非C标准的扩展C语言或者精简C语言,让小白开开眼

_奶咖君_ 发表于 2025-1-11 17:08:00

wangxiangtan 发表于 2025-1-11 16:31
搜了半天没找到第三中非C语言标准的扩展C语言,

网上大多数人的认知就是标准C和嵌入式C,


其实你可以从编译器入手,,在我刚开始学的时候,以为所有的C语言都是VC++6.0呢。。。

health 发表于 2025-1-11 18:27:22

仅指C51。
因为8051单片机内部存储器就是分区的,有data bdata idata xdata code等,寻址方式,操作指令,速度,功能各不相同。为8051而做的C编译器自然要支持这些扩展。
Keil C51,SDCC,IAR 8051都是51的C编译器,大同小异,各部写法可能有区别,比如C51写做data,SDCC写做__data。

晨露 发表于 2025-1-12 09:19:06

楼主用的什么编译器
页: [1]
查看完整版本: 小白学单片机记录之关键字data、bit,奇怪的编译问题