正文
大家好,我是bug菌!
#和##对于大部分C语言玩得还算比较溜的朋友并不是很陌生,不过能把这两个知识点游刃有余的应用到所在代码中的每个角落,似乎并没有几个人能够做到,学的时候朗朗上口,而编码的时候却抛之脑后。
但是今天bug菌还是想重新介绍这两个“兄弟”,希望大家能够写出"秀"一点的代码~
1
#和##基础
#主要是将宏参数转化为字符串
##主要是将两个标识符拼接成一个标识符
参考demo:
1#include <stdio.h>
2#include <stdlib.h>
3
4//#的简单使用
5#define STR(str) #str
6
7//##的简单使用
8#define CMB(a,b) a##b
9
10int main(int argc, char *argv[]) {
11
12 int CMB(uart,1) = 5;
13 int CMB(uart,2) = 10;
14
15 printf("#的简单使用:\r\n");
16 printf("%s\r\n",STR(3.1415));
17 printf("%s\r\n",STR(abcd));
18
19 printf("##的简单使用:\r\n");
20 printf("%d\r\n",uart1);
21 printf("%d\r\n",uart2);
22
23 return ;
24}
输出结果:
2
#的玩法
1#include <stdio.h>
2#include <stdlib.h>
3
4//#打印调试
5#define DebugLogExpr(Expr) printf("%s : %d\r\n",#Expr, Expr);
6
7//私有参数访问
8int sFucntion(void)
9{
10 static int var = 10;
11 return var;
12}
13
14int main(int argc, char *argv[]) {
15
16 int DebugVar = 50;
17
18 DebugLogExpr(DebugVar); //直接打印变量名和变量
19 DebugLogExpr(100/5); //打印表达式及结果
20 DebugLogExpr(sFucntion()); //打印相关函数名及结果
21
22 return 1;
23}
输出结果:
1#include <stdio.h>
2#include <stdlib.h>
3
4//#的简单使用
5#define STR(str) #str
6
7//##的简单使用
8#define CMB(a,b) a##b
9
10int main(int argc, char *argv[]) {
11
12 int CMB(uart,1) = 5;
13
14 printf("%s\r\n",STR(CMB(uart,1)));
15
16 return ;
17}
1 #include <stdio.h>
2#include <stdlib.h>
3
4//#的简单使用
5#define STR(str) #str
6
7//##的简单使用
8#define CMB(a,b) a##b
9
10#define STR_CON(str) STR(str) //转换宏
11
12int main(int argc, char *argv[]) {
13
14 int CMB(uart,1) = 5;
15
16 printf("%s\r\n",STR_CON(CMB(uart,1)));
17
18 return ;
19}
3
##的玩法
1#include <stdio.h>
2#include <stdlib.h>
3
4#define DF_STRUCT(name) typedef struct tag##name name;\
5 struct tag##name
6
7DF_STRUCT(DevManage)
8{
9 int index; //索引
10 int Access; //权限
11 //...
12};
13
14int main(int argc, char *argv[]) {
15
16 DevManage stDevManage;
17
18 stDevManage.index = 1;
19 stDevManage.Access = 666;
20
21 printf("Dev Index :%d\n",stDevManage.index );
22 printf("Dev Access:%d\n",stDevManage.Access );
23
24 return 1;
25}
1#include <stdio.h>
2#include <stdlib.h>
3
4//假如这是stm32库中的宏
5#define GPIO_Pin_0 ((int)0x0001) /*!< Pin 0 selected */
6#define GPIO_Pin_1 ((int)0x0002) /*!< Pin 1 selected */
7#define GPIO_Pin_2 ((int)0x0004) /*!< Pin 2 selected */
8#define GPIO_Pin_3 ((int)0x0008) /*!< Pin 3 selected */
9
10#define USART1 ((int *) 0x1000)
11#define USART2 ((int *) 0x2000)
12
13
14//拼接变量
15#define UARTX 1
16
17//终的组合标识符
18#define UART1_CORE USART1
19#define UART1_RX GPIO_Pin_0
20#define UART1_TX GPIO_Pin_1
21
22#define UART2_CORE USART2
23#define UART2_RX GPIO_Pin_2
24#define UART2_TX GPIO_Pin_3
25
26//拼接过程
27#define _UARTX_CORE(uartx) UART##uartx##_CORE
28#define UARTX_CORE(uartx) _UARTX_CORE(uartx)
29
30
31#define _UARTX_RX(uartx) UART##uartx##_RX
32#define UARTX_RX(uartx) _UARTX_RX(uartx)
33
34#define _UARTX_TX(uartx) UART##uartx##_TX
35#define UARTX_TX(uartx) _UARTX_TX(uartx)
36
37
38int main(int argc, char *argv[]) {
39
40 //组合标识符的使用
41 printf("0x%x\n",UARTX_CORE(UARTX));
42 printf("0x%x\n",UARTX_RX(UARTX));
43 printf("0x%x\n",UARTX_TX(UARTX));
44
45 return 1;
46}
后
文章来源公众号:后一个bug
原文链接:https://mp.weixin.qq.com/s/ixtfhc2suad22Y_HYO2Ejw