宏
这个例程使用很多宏来简化客户类与LUA的整合工作,第一次看上去这些宏有点让人头大,不过好消息是即使你不明白这些宏是如何运行的,你还是能够很容易地使用它们来。当然我相信学习这些宏是如何运作的是很有好处的,无论喜欢与否,它们迟早有用。
我们从创建一个名为sgLUA.h的文件开始,并添加通用预处理语句以及包含LUA与LUNA头文件:
- extern "C" {
-
- #include "lua.h"
-
- #include "lauxlib.h"
-
- #include "lualib.h"
-
- }
-
-
-
- #include "./luna/luna.h"
extern "C" {
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}
#include "./luna/luna.h"
我们最先看的这个宏DECLARE_SCRIPT_CLASS是你在声明一个类的时候使用的(头文件中),它添加两个静态成员变量到你的类中,一个是持有类名字的string,另一个是一个methods array,持有所有与LUA绑定的函数。下面是这个宏的代码实现:
- #define DECLARE_SCRIPT_CLASS(ClassName) \
-
- public: \
-
- static const char className[]; \
-
- static Luna<ClassName>::RegType methods[];
#define DECLARE_SCRIPT_CLASS(ClassName) \
public: \
static const char className[]; \
static Luna<ClassName>::RegType methods[];
接着的这一个宏是在你所声明的类的实现文件中使用的,在后面我们讲看到它如何被使用的,这个宏只是初始化类的名字。
接着的三个宏是连接在一起使用的,它们被用来指定哪些个成员函数将被当作LUA的绑定函数。
- #define DEFINE_SCRIPT_CLASS(ClassName) \
-
- Luna<ClassName>::RegType ClassName::methods[] = {
-
-
-
- #define SCRIPT_METHOD(ClassName, MethodName) { #MethodName, &ClassName::MethodName }
-
-
-
- #define END_SCRIPT_CLASS };
#define DEFINE_SCRIPT_CLASS(ClassName) \
Luna<ClassName>::RegType ClassName::methods[] = {
#define SCRIPT_METHOD(ClassName, MethodName) { #MethodName, &ClassName::MethodName }
#define END_SCRIPT_CLASS };
如果这些宏让你看的头大,当你看到它们是如何被使用的时候就会轻松很多,它们只不过是初始化先前使用DECLARE_SCRIPT_CLASS宏声明的methods array。
- #define REGISTER_CLASS(ClassName) \
-
- Luna<ClassName>::Register(m_pLuaState);
#define REGISTER_CLASS(ClassName) \
Luna<ClassName>::Register(m_pLuaState);
这个宏很重要,它通过luna将C++类绑定到LUA中,先看代码吧,在后面我们讲谈论如何使用它。 这就是我们所需要的所有宏,当然,有些人喜欢添加一个像下面一样的额外的宏:
#define SCRIPT_FUNCTION(FunctionName) int32 FunctionName(luaState* L);
他们使用这个宏来定义在LUA中调用的类成员函数,通过这种方法你可以很清晰的看明白哪些成员函数是被脚本使用的,哪些不是。如果你喜欢你也可以这么做,这只是个人喜好而已,我个人并不使用它,但是我会在后面讲述如何使用这个宏来满足下你的猎奇心。 |