找回密码
 立即注册
查看: 221|回复: 6

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

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:515
  • 最近打卡:2025-05-05 11:10:48

21

主题

564

回帖

2686

积分

金牌会员

积分
2686
发表于 2025-1-11 11:18:24 | 显示全部楼层 |阅读模式
在标准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不是关键字,随便当变量用编译正常通过:
byte不是关键字2025-01-11_104140.jpg

二、data 是关键字,当变量用编译不通过:
data是关键字2025-01-11_104335.jpg

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

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

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:436
  • 最近打卡:2025-05-06 08:38:18

33

主题

2355

回帖

4872

积分

论坛元老

积分
4872
发表于 2025-1-11 13:31:40 | 显示全部楼层
没有什么嵌入式C,,,这些非C语言标准的关键字要看编译器。。。换一个编译器,可能就又是一套关键字,,
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:515
  • 最近打卡:2025-05-05 11:10:48

21

主题

564

回帖

2686

积分

金牌会员

积分
2686
发表于 2025-1-11 16:11:02 | 显示全部楼层
_奶*** 发表于 2025-1-11 13:31
没有什么嵌入式C,,,这些非C语言标准的关键字要看编译器。。。换一个编译器,可能就又是一套关键字,, ...

我次奥,到底有多少非C标准的C语言
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:515
  • 最近打卡:2025-05-05 11:10:48

21

主题

564

回帖

2686

积分

金牌会员

积分
2686
发表于 2025-1-11 16:31:40 | 显示全部楼层
_奶*** 发表于 2025-1-11 13:31
没有什么嵌入式C,,,这些非C语言标准的关键字要看编译器。。。换一个编译器,可能就又是一套关键字,, ...

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:436
  • 最近打卡:2025-05-06 08:38:18

33

主题

2355

回帖

4872

积分

论坛元老

积分
4872
发表于 2025-1-11 17:08:00 | 显示全部楼层
wangxi*** 发表于 2025-1-11 16:31
搜了半天没找到第三中非C语言标准的扩展C语言,

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

其实你可以从编译器入手,,在我刚开始学的时候,以为所有的C语言都是VC++6.0呢。。。
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-04-01 23:18:33

15

主题

139

回帖

983

积分

高级会员

积分
983
发表于 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。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:78
  • 最近打卡:2025-04-29 08:19:44
已绑定手机

4

主题

153

回帖

300

积分

中级会员

积分
300
发表于 2025-1-12 09:19:06 | 显示全部楼层
楼主用的什么编译器
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-6 16:31 , Processed in 0.132202 second(s), 96 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表