macro_magic
先补充点小知识,在 C++的宏定义中#和##的作用 这里表示一个宏处理
#define xxx 123
1
一个#表示,取字符串本身,这里 NAME(youdao),经过宏处理就表示字符串 "youdao"
#define NAME(val) #val
NAME(youdao)//"youdao"
1
2
3
2
3
这里两个#,表示字符的连接
#define CONNECT(a,b) (#a)##(#b)
CONNECT(you, dao);//"youdao"
1
2
3
2
3
logdef.h 文件
#ifndef _LOG_DEF_H_
#define _LOG_DEF_H_
#if !defined(LOG_DEF)
#define LOG_DEF(val, log) val,
#define LOG_DEF_ENUM
enum {
#endif
LOG_DEF(LT_LogIn, LogIn)
LOG_DEF(LT_LogOut, LogOut)
#if defined(LOG_DEF_ENUM)
#undef LOG_DEF_ENUM
#undef LOG_DEF
LOG_DEF_MAX
};
#endif
#endif
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
头文件中通过宏定义 #define LOG*DEF(val, log) val, 得到了一个日志 id 定义枚举,文件经过预处理,等于得到了一下文件
#ifndef \_LOG_DEF_H*
#define _LOG_DEF_H_
enum {
LT_LogIn,
LT_LogOut,
LOG_DEF_MAX
};
#endif
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
logdef.cpp 文件
#include "LogDef.h"
struct SLogDef
{
const char* str;
const char* strlog;
};
static const SLogDef logdef*list[] = {
#undef \_LOG_DEF_H*
#define LOG_DEF(val, strlog){#val, #strlog},
#include "LogDef.h"
#undef LOG_DEF
};
const char\* log_string(int log_type)
{
if (log_type < 0 || log_type >= LOG_DEF_MAX)
{
return "WrongType";
}
return logdef_list[log_type].strlog;
}
bool log_sampling(int log_type)
{
if(log_type < 0 || log_type >= LOG_DEF_MAX)
{
return true;
}
return logdef_list[log_type].sampling;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
文件通过使用#undef 和 #include 重新加载了 logdef.h 文件,并且通过 #define LOG_DEF 生成了一个日期字符串数组,文件经过预编译得到文件如下
#include "LogDef.h"
struct SLogDef
{
const char* str;
const char* strlog;
};
static const SLogDef logdef_list[] = {
{"LT_LogIn", "LogIn"},
{"LT_LogOut", "LogOut"},
};
const char\* log_string(int log_type)
{
if (log_type < 0 || log_type >= LOG_DEF_MAX)
{
return "WrongType";
}
return logdef_list[log_type].strlog;
}
bool log_sampling(int log_type)
{
if(log_type < 0 || log_type >= LOG_DEF_MAX)
{
return true;
}
return logdef_list[log_type].sampling;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
编辑 (opens new window)
上次更新: 2023/02/24, 10:34:03