#define st(x) do { x } while (__LINE__ == -1)及“\”分析

时间:2022-12-13 15:32:34

今天看cc2530点对点通信实验的代码时,层层深扒发现了一个陌生的宏定义——#define st(x) do { x } while (_LINE_ == -1)查阅后恍然大悟,喜悦之情难以言表,稍稍总结下吧~

#define CC2530_WAIT_CLK_UPDATE()    st( uint8 ____clkcon; \                                      uint8 ____clkconsta; \                                     ____clkcon = CLKCONCMD; \                                         do { \                                           ____clkconsta = CLKCONSTA; \                                         } while (____clkconsta != ____clkcon); )
#define st(x)      do { x } while (__LINE__ == -1)

这段代码里开始有两个地方不太明白:
- st(x)的宏定义用来干嘛,LINE是什么东东?
- 宏定义中的“\”是什么意思?

答:
1. LINE 是C/C++的内部宏定义:得到当前的行号。故while (LINE == -1)等价于while (0),即do循环体只执行一次!目的只有一个——把某一段多行代码连在一起执行。否则若直接定义#define st(x ) x,那么在if调用中很容易出错eg主函数中有if(0) st(a++;c=a;) 时会解释为不被期望的if(0) {a++;} c=a;造成错误。(不得不惊叹人们的智慧呀!太聪明了点!!)。原代码中st()中还嵌套了一个do…while循环其中while (____clkconsta != ____clkcon)是真正起到等待时钟设定完成功能的代码。因为CLKCON与CLKCONSTA的位定义完全是一样的,用CLKCON对cc2530系统时钟进行设定,等待系统时钟完成设定后会完全反映在CLKCONSTA中,正常运行后两者内容完全一样,即变为while (0)整段代码运行结束。
2. #define 是以换行为定义结束的,要是一行太长看起来就不方便了,故使用”\”来链接两行。