Lua 与C/C++ 交互系列:注冊枚举enum到Lua Code中

在Lua Code中注冊C/C++的枚举很easy,就像注冊全局变量一样。我们使用枚举名称作为命名空间,来避免注冊的枚举发生冲突。注冊的枚举存储在全局环境(线程环境)中。

当在Lua Code中訪问枚举时,通过名称来訪问相应的值。

sample_9.cpp   c++代码例如以下:

//在Lua Code中注冊的enum,为了避免冲突,以名称作为enumTable来存储
enum Week
{
	Monday,
	Tuesday,
	Wednesday,
	Thursday,
	Friday,
	Saturday,
	Sunday,
};
//定义宏用来方便使用设置键值
#define LUA_ENUM(L, val)   lua_pushliteral(L, #val);   lua_pushnumber(L, val);   lua_settable(L, -3)

void register_enum(lua_State* L)
{   //创建一个enumTable,用于存储Enum的全部枚举。通过枚举名称=枚举值
	lua_newtable(L);
	//设置 enumTable["Monday"]=Monday
	LUA_ENUM(L, Monday);
	LUA_ENUM(L, Tuesday);
	LUA_ENUM(L, Wednesday);
	LUA_ENUM(L, Thursday);
	LUA_ENUM(L, Friday);
	LUA_ENUM(L, Saturday);
	LUA_ENUM(L, Sunday);
	//把enumTable存在在_G 全局环境(线程环境)中,以枚举名称作为键
	lua_setglobal(L,"Week");
}
int main(int argc, char *argv[])
{
	lua_State* L = lua_open();
	luaL_openlibs(L);
	register_enum(L);
	luaL_dofile(L, "sample_9.lua");
    lua_close(L);
    return 0;
}

sample_9.lua   Lua Code代码例如以下:

local Week=_G["Week"]
print(Week)
print(Week.Monday)
print(Week.Tuesday)
print(Week.Wednesday)
print(Week.Thursday)
print(Week.Friday)
print(Week.Saturday)
print(Week.Sunday)

输出结果:

时间: 2024-11-05 20:11:42

Lua 与C/C++ 交互系列:注冊枚举enum到Lua Code中的相关文章

Lua 与C/C++ 交互系列:动态注册枚举enum到Lua Code中,在运行时在Lua Code中获取内省信息

在Lua 5.1 Reference Manual  对于Lua 值和类型的介绍.Lua是一个动态语言,在Lua中变量仅仅有值而没有类型.所以在Lua中的变量不需要声明.所以的值本身包含类型. 其实Lua 包含一种运行时类型识别,通过type()函数,可以在运行时获取值的类型. 信息来自: Lua 5.1 Reference Manual  Values and Types Lua is a dynamically typed language. This means that variable

Lua 与C/C++ 交互系列:Light userdata翻译

利用零碎的时间,先把以后用的知识点提前准备好.最近比较忙,正在准备一篇绑定C++对象到Lua中.但是,不想轻易下手,希望做足准备. 这篇翻译来自于lua-users.org   ,原文地址. Light User Data Light userdata, like heavy userdata, are a form of userdata, which is one of the basic data types in Lua .Light userdata are characterized

Lua 与C/C++ 交互系列: Lua调用C/C++函数(4-1)

1.本文将继续讲解在Lua Code中调用注册的C函数.偶在学习本文知识点时,由于知识点的遗漏,在这个上面浪费了大量时间和精力.一直都没有没明白,Lua 通过面向对象的方式是如果调用注册的C函数.在Programming In Lua一书,有对这个方面的讲解.但是当时看书,就是不理解.因为在前面的章节中,有一个重要的知识点被遗漏.在Lua 元方法中,有两个特别重要的.__index 和__newindex被我遗漏.这两个元方法特别重要,对于定义和拓展Lua的机制,基本依靠这两个. 2.本文首先由

Lua 与C/C++ 交互系列: Lua调用C/C++函数(3)

1.Lua API中提供注册C函数关键在lua_pushcclouse()函数.该函数可以在Lua Code中定义C函数. 但是Lua 提供了几个常用的宏定义,用于注册C函数. 这几个宏定义为: /#define lua_pushcfunction(L,f) lua_pushcclosure(L, (f), 0) #define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n))) LUALIB_API vo

Lua 与C/C++ 交互系列: Lua调用C/C++函数(2).

1.本文将使用void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n); 来讲解在Lua Code中注册C函数,其他注册方式将在下一篇文章中讲解. When a C function is created, it is possible to associate some values with it, thus creating a C closure ; these values are then accessible to

Lua 与C/C++ 交互系列:注册枚举enum到Lua Code中

在Lua Code中注册C/C++的枚举非常容易,就像注册全局变量一样.我们使用枚举名称作为命名空间,来避免注册的枚举发生冲突.注册的枚举存储在全局环境(线程环境)中. 当在Lua Code中访问枚举时,通过名称来访问对应的值. sample_9.cpp   c++代码如下: //在Lua Code中注册的enum,为了避免冲突,以名称作为enumTable来存储 enum Week { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday

Lua 与C/C++ 交互系列: Lua调用C/C++函数(1).

在学习Lua和C/C++过程中,在这个过程花费了不少时间.总是在几个地方卡住.Programming  In Lua 和Lua 5.1 Reference Manual  为主要学习资料. 但是Lua 5.1 Reference Manual 在演化过程中,把对虚拟栈管理部分分散在不同的章节里面.Lua 5.0 Reference Manual 版本却有这一个章节.然后,后来在lua 源代码中找到了对虚拟栈管理东东.还有在Lua的不同版本中,对注册C函数也有不同的演化.比如Function lu

Lua 与C/C++ 交互系列: Lua调用C/C++函数(4-2)

1.本文继续讲解Lua调用C/C++函数,本文的重点是通过metatable来实现Lua Code面向对象调用注册的C函数.本文中涉及的Environment 伪索引,userdata 以及GC 垃圾回收器的内容,都是简单的讲解.不作为本文的重点,这些内容都将在以后的章节中继续讲解. 2.本文涉及的到主要知识点补充说明. 2.1 void *lua_newuserdata (lua_State *L, size_t size); 函数说明 This function allocates a ne

Lua与C/C++交互问题

初学lua,遇到注册C/C++交互函数问题 在lua与C/C++交互时,C/C++的注册Lua函数若是一个有返回类型(压栈)而不是获取类型的时候应该返回1而不是返回0,否则会出现在Lua中值为nil(空) 不太明白为什么事这样,如果有知道的大神,麻烦讲解下 如: 应该是 int createClass(lua_State *L) { lua_class *newLua = (lua_class*)lua_newuserdata(L , sizeof(lua_class)); new (newLu