标题: 这句C语言代码怎么理解呀?#define LED2_ON() (LED2=0) [打印本页]

作者: 创造生活    时间: 2022-7-1 17:55
标题: 这句C语言代码怎么理解呀?#define LED2_ON() (LED2=0)
     各位下午好,我在单片机DIY区下载一个DIY的素材,有一句代码从语法角度看不明白,代码如下 :#define   LED2_ON()   (LED2 = 0)    希望指点一下!!!

作者: 18701931930    时间: 2022-7-1 19:22
#define是宏定义,意思就是用LED2_ON() 代替 (LED2 = 0)
作者: 17337161031    时间: 2022-7-1 19:29
宏定义 后面的命令可以用前面的表示
作者: Hephaestus    时间: 2022-7-1 20:06
18701931930 发表于 2022-7-1 19:22
#define是宏定义,意思就是用LED2_ON() 代替 (LED2 = 0)

说反了,凡是出现LED2_ON()的地方,一律用(LED2=0)代替。
作者: wwh2382    时间: 2022-7-1 20:36
挖个坑,让你以为是一个函数
作者: wojiaoguogai    时间: 2022-7-2 08:22
编译阶段,把LED2_ON()   替换为(LED2 = 0)   
作者: 创造生活    时间: 2022-7-3 19:26
非常感谢大家的指导!已经搞明白了!对于#define LED2_ON() (LED2=0)这行代码,我的理解可以看做是一函数的定义,函数名LED2_ON(),函数体为(LED2=0),当主调函数中出现LED2_ON()代码,等于主调函数中执行的是其函数中的语句,LED2=0;。
作者: daemondong    时间: 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;
语法正确,但是逻辑上没啥意思。

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

看来你真是掉进坑里了。那种语句只是一个披着函数外衣的等式,最多算是个伪函数。如果你以为那是个函数声明,然后满屏的去找函数体,就更是上大当了。
作者: kmsj    时间: 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的问题,用起来也很直观。
作者: haha嘻嘻    时间: 2022-7-4 15:27
daemondong 发表于 2022-7-4 10:03
你还不是全明白,宏定义和函数不一样,宏定义只是替换。 比如
LED2_ON(); 就变成(LED2=0);


这个是正解,define是纯替换,你可以用c语言自己试一试算加减乘除,会发现define是纯纯的替换,连括号都不带的那种
作者: Hephaestus    时间: 2022-7-4 20:33
#define LED2_ON() (LED2=0)只是简单替换,没有任何函数定义的意思。

inline void LED2_ON(void){
  LED2=0;
}
这么写与define功能完全一致,但却是函数定义。注意inline不是标准c语言关键字,但是绝大多数c语言编译器都支持,写法各有不同,比如可能是__inline,具体怎么写查编译器手册。
作者: youxiangfaderen    时间: 2022-7-5 17:33
就是以后任何时候都可以用LED2_ON()直接就能让LED2这个变量等于零了
作者: 创造生活    时间: 2022-7-10 07:05
感谢各位老师指导让我扩展了知识
作者: 1276327078    时间: 2022-9-8 18:02
创造生活 发表于 2022-7-3 19:26
非常感谢大家的指导!已经搞明白了!对于#define LED2_ON() (LED2=0)这行代码,我的理解可以看做是一函数的 ...

不能这样理解




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