今天看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 是以换行为定义结束的,要是一行太长看起来就不方便了,故使用”\”来链接两行。