1 遇到的问题
在游戏开发过程中是要记录一些玩家日志的,以便分析一些玩家的行为。当开发过程中使用脚本和C++语言开发时,又需要使用同一套日志id。
通常的做法是这样的,建立日志的枚举字符串对应关系,然后通过字符串的唯一id建立字符串数组,在使用时通过日志枚举取的日志字符串
2 补充一点小知识
c++ 中的 “#”
表示宏处理,但是在宏处理中出现“#”
表示取字符串本身,例:
#define NAME(val) #val
NAME(hello); // 这里预处理之后相当于 “hello”
“##”
在宏处理中出现表示,字符串的连接,例:
#define CONNECT(a, b) (#a)##(#b)
CONNECT(hello, world); //这里再预处理之后相当于 "helloworld"
3 在日志定义中巧妙的使用宏处理
//LogDef.h
#ifndef _LOG_DEF_H_
#define _LOG_DEF_H_
#if !defined(LOG_DEF)
#define LOG_DEF(val, log) val, // 定义 LOG_DEF 的宏定义
#define LOG_DEF_ENUM // 定义LOG_DEF_ENUM 的宏定义
enum {
#endif
LOG_DEF(LT_LogIn, LogIn) // 这一部分是日志枚举的定义部分
LOG_DEF(LT_LogOut, LogOut) // 这一部分是日志枚举的定义部分
#if defined(LOG_DEF_ENUM)
#undef LOG_DEF_ENUM // 取消对LOG_DEF_ENUM 的宏定义
#undef LOG_DEF // 取消对LOG_DEF 的宏定义
LOG_DEF_MAX // 日志枚举定义的最大值
};
#endif
#endif
//LogDef.cpp
#include "LogDef.h"
// 日志定义结构体
struct SLogDef
{
const char* str;
const char* strlog;
};
static const SLogDef logdef_list[] = {
#undef _LOG_DEF_H_ // 取消对 _LOG_DEF_H_ 的宏定义
#define LOG_DEF(val, strlog){#val, #strlog}, // 定义 LOG_DEF 的宏定义
#include "LogDef.h" // 重新编译 LogDef.h 文件,这里注意当前文件的 LOG_DEF 宏定义替换了 LogDef.h 中的宏定义
#undef LOG_DEF // 编译完,取消 LOG_DEF 的宏定义,这里生成了 SLogDef logdef_list数组
};
// 获取日志字符串
const char* log_string(int log_type)
{
if (log_type < 0 || log_type >= LOG_DEF_MAX)
{
return "WrongType";
}
return logdef_list[log_type].strlog;
}
这样在编译之后生成的文件如下
//LogDef.h
#ifndef _LOG_DEF_H_
#define _LOG_DEF_H_
enum {
LT_LogIn, // 这一部分是日志枚举的定义部分
LT_LogOut, // 这一部分是日志枚举的定义部分
LOG_DEF_MAX // 日志枚举定义的最大值
};
#endif
//LogDef.cpp
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;
}