宏定义在游戏日志枚举中的应用

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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值