找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1681|回复: 14
打印 上一主题 下一主题
收起左侧

这句C语言代码怎么理解呀?#define LED2_ON() (LED2=0)

  [复制链接]
跳转到指定楼层
楼主
ID:881715 发表于 2022-7-1 17:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
     各位下午好,我在单片机DIY区下载一个DIY的素材,有一句代码从语法角度看不明白,代码如下 :#define   LED2_ON()   (LED2 = 0)    希望指点一下!!!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:554500 发表于 2022-7-1 19:22 | 只看该作者
#define是宏定义,意思就是用LED2_ON() 代替 (LED2 = 0)
回复

使用道具 举报

板凳
ID:329625 发表于 2022-7-1 19:29 | 只看该作者
宏定义 后面的命令可以用前面的表示
回复

使用道具 举报

地板
ID:883242 发表于 2022-7-1 20:06 | 只看该作者
18701931930 发表于 2022-7-1 19:22
#define是宏定义,意思就是用LED2_ON() 代替 (LED2 = 0)

说反了,凡是出现LED2_ON()的地方,一律用(LED2=0)代替。
回复

使用道具 举报

5#
ID:748788 发表于 2022-7-1 20:36 | 只看该作者
挖个坑,让你以为是一个函数
回复

使用道具 举报

6#
ID:415064 发表于 2022-7-2 08:22 | 只看该作者
编译阶段,把LED2_ON()   替换为(LED2 = 0)   
回复

使用道具 举报

7#
ID:881715 发表于 2022-7-3 19:26 | 只看该作者
非常感谢大家的指导!已经搞明白了!对于#define LED2_ON() (LED2=0)这行代码,我的理解可以看做是一函数的定义,函数名LED2_ON(),函数体为(LED2=0),当主调函数中出现LED2_ON()代码,等于主调函数中执行的是其函数中的语句,LED2=0;。
回复

使用道具 举报

8#
ID:827243 发表于 2022-7-4 10:03 | 只看该作者
创造生活 发表于 2022-7-3 19:26
非常感谢大家的指导!已经搞明白了!对于#define LED2_ON() (LED2=0)这行代码,我的理解可以看做是一函数的 ...

你还不是全明白,宏定义和函数不一样,宏定义只是替换。 比如
LED2_ON(); 就变成(LED2=0);

if LED2_ON() a=0; 就变成 if (LED2=0) a=0;
语法正确,但是逻辑上没啥意思。
回复

使用道具 举报

9#
ID:748788 发表于 2022-7-4 10:52 | 只看该作者
创造生活 发表于 2022-7-3 19:26
非常感谢大家的指导!已经搞明白了!对于#define LED2_ON() (LED2=0)这行代码,我的理解可以看做是一函数的 ...

看来你真是掉进坑里了。那种语句只是一个披着函数外衣的等式,最多算是个伪函数。如果你以为那是个函数声明,然后满屏的去找函数体,就更是上大当了。
回复

使用道具 举报

10#
ID:383215 发表于 2022-7-4 11:44 | 只看该作者
我也学习了,实际就是解决看程序的直观问题。51单片机I/O口下拉能力较强,LED正极接VCC,负极串一个电阻接I/O口
sbit led = P1^0 ;
led = 0 ;        //打开LED
led = 1 ;        //关闭LED
这样看程序很不直观
#define   LED_ON()   (LED = 0)
#define   LED_OFF()   (LED = 1)
LED_ON()                //打开LED
LED_OFF()        //关闭LED
这样看程序很直观,连注释都可以不需要
另外也可以解决没有位操作单片机的位操作问题,比如AVR单片机没有位操作
#define  led                 PA0
#define  led_off( )         PORTA &= ~( 1 << led )
#define  led_on( )         PORTA |=  ( 1 << led )
DDRA |= ( 1 << led ) ;       
led_on                //打开LED
led_off ()        //关闭LED
这就相当于解决了AVR单片机的位操作,这个方法也可以解决没有位操作的寄存器任何一个位置0置1的问题,用起来也很直观。
回复

使用道具 举报

11#
ID:1035058 发表于 2022-7-4 15:27 来自手机 | 只看该作者
daemondong 发表于 2022-7-4 10:03
你还不是全明白,宏定义和函数不一样,宏定义只是替换。 比如
LED2_ON(); 就变成(LED2=0);


这个是正解,define是纯替换,你可以用c语言自己试一试算加减乘除,会发现define是纯纯的替换,连括号都不带的那种
回复

使用道具 举报

12#
ID:883242 发表于 2022-7-4 20:33 | 只看该作者
#define LED2_ON() (LED2=0)只是简单替换,没有任何函数定义的意思。

inline void LED2_ON(void){
  LED2=0;
}
这么写与define功能完全一致,但却是函数定义。注意inline不是标准c语言关键字,但是绝大多数c语言编译器都支持,写法各有不同,比如可能是__inline,具体怎么写查编译器手册。
回复

使用道具 举报

13#
ID:1038452 发表于 2022-7-5 17:33 | 只看该作者
就是以后任何时候都可以用LED2_ON()直接就能让LED2这个变量等于零了
回复

使用道具 举报

14#
ID:881715 发表于 2022-7-10 07:05 来自手机 | 只看该作者
感谢各位老师指导让我扩展了知识
回复

使用道具 举报

15#
ID:1002955 发表于 2022-9-8 18:02 | 只看该作者
创造生活 发表于 2022-7-3 19:26
非常感谢大家的指导!已经搞明白了!对于#define LED2_ON() (LED2=0)这行代码,我的理解可以看做是一函数的 ...

不能这样理解
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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