增加 宏连接符.
This commit is contained in:
parent
df30013cb0
commit
2f3f9a26a4
|
@ -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. 已知双向链表表头结构如下:
|
||||
|
|
Loading…
Reference in New Issue