STC IO配置库
就当是自学笔记吧,对 记号粘贴运算符## 加深一下理解。
记号粘贴运算符是一个二元运算符,可以出现在所有宏的替换文本中。该运算符会把左、右操作数结合在一起,作为一个记号,因此,它常常被称为记号粘贴运算符(token-pasting operator)。如果结果文本中还包含有宏名称,则预处理器会继续进行宏替换。出现在 ## 运算符前后的空白符连同 ## 运算符本身一起被删除。
#define DEBUG_A_MSG "DEBUG_MSG_A"
#define DEBUG_B_MSG "DEBUG_MSG_B"
#define MSG(x) DEBUG_MSG_##x##MSG //这句使用了 记号粘贴运算符:##
a = MSG(A);
b = MSG(B);
这些宏被预处理器替换以后,就换成了下面的代码:
#define DEBUG_A_MSG "DEBUG_MSG_A"
#define DEBUG_B_MSG "DEBUG_MSG_B"
a = DEBUG_A_MSG;
b = DEBUG_B_MSG;
STC的IO寄存器如下图,在配置IO口寄存器PnM1和PnM0时一般会这样写,比如将配置P0.7为输出方向时:
P0M1 &= ~(1<<7);
P0M0 |= (1<<7);
如果能像Arduino那样更直观的配置这些IO那就太舒服了,所以如果我们能过宏定义巧妙的将这些有规律的定义统一起来写一段宏定义来替换上面那些原始写法,在以后的使用中将会比较方便。
做一个简单的尝试
#define _PnM1(n) P##n##M1
#define _PnM0(n) P##n##M0
void main(){
_PnM1(0) &= ~(1<<7);
_PnM0(0)