增加 宏连接符.

This commit is contained in:
lion187 2023-07-06 13:49:47 +08:00
parent df30013cb0
commit 2f3f9a26a4
1 changed files with 55 additions and 0 deletions

View File

@ -145,6 +145,61 @@ DEBUG(0, "compile date:%s, time:%s.\n", __DATE__, __TIME__); // 打印编译
DEBUG(1, "Hello.\n"); // 在运行时, 此行不会被打印.
```
## 2.4.4 宏连接符
“#” 符号用于把一个宏参数直接转换为相应的字符串:
```cpp
#define CONVERT(a) #a
int test_convert = 10;
printf(CONVERT(test_convert)); // print test_convert.
```
“##” 符号用于连接 2 个标识符:
```cpp
#define CAT(a, b) a##b
int num5 = 20;
printf("%d\n", CAT(num, 5)); // print 20.
```
## 2.4.5 示例
一个使用宏自定义的 Log 系统如下(注意 "] " 前后要有空格,否则编译错误)
```cpp
#define LOG_DBG 0
#define LOG_INF 1
#define LOG_WAR 2
#define LOG_ERR 3
#define LOG_NOP 4
#define LOG_LEVEL LOG_DBG
#if (LOG_LEVEL<=LOG_DBG)
#define DLog(tag, ...) printf("[DBG|"#tag "] " __VA_ARGS__)
#else // !(LOG_LEVEL<LOG_DBG)
#define DLog(tag, ...)
#endif // (LOG_LEVEL<LOG_DBG)
#if (LOG_LEVEL<=LOG_INF)
#define ILog(tag, ...) printf("[INF|"#tag "] " __VA_ARGS__)
#else // !(LOG_LEVEL<LOG_INF)
#define ILog(tag, ...)
#endif // (LOG_LEVEL<LOG_INF)
#if (LOG_LEVEL<=LOG_WAR)
#define WLog(tag, ...) printf("[WAR|"#tag "] " __VA_ARGS__)
#else // !(LOG_LEVEL<LOG_WAR)
#define WLog(tag, ...)
#endif // (LOG_LEVEL<LOG_WAR)
#if (LOG_LEVEL<=LOG_ERR)
#define ELog(tag, ...) printf("[ERR|"#tag "] " __VA_ARGS__)
#else // !(LOG_LEVEL<LOG_WAR)
#define ELog(tag, ...)
#endif // (LOG_LEVEL<LOG_WAR)
```
## 练习
1. 已知双向链表表头结构如下: