使用经验
- 在Lua中调用C++函数时必须写上所有参数,包括缺省参数;
- 在使用有 const char* 参数的注册函数中判断该参数是否为 NULL 的同时还要判断是否是空串,即"",并且在Lua中调用该函数时为 NULL 的参数改用空串""代替;
- 不要在Lua中传递nil或0给字符串参数,在给Lua注册使用的函数接口中字符串参数尽可能的用std::string代替;
- 有C++注册类对象的指针作为参数的注册函数,在Lua中调用时允许从nil转换到C++中的NULL;
在C++中调用Lua函数
2 // 建立新的Lua环境
3 lua_State *L = luaL_newstate();
4
5 // 让LuaBind“认识”这个Lua环境
6 luabind::open(L);
7
8 // 定义一个叫add的Lua函数
9 luaL_dostring(L,
10 " function add(first, second)\n "
11 " return first + second\n "
12 " end\n "
13 );
14
15 // 调用add函数
16 try {
17 std::cout << " Result: "
18 << luabind::call_function< int>(L, " add ", 2, 3)
19 << std::endl;
20
21 } catch (luabind::error& e) {
22 std::cout << " Catch Exception: " << e.what() << std::endl;
23 }
24
25 lua_close(L);
26
27 return 0;
28 }
在Lua代码中调用C++函数
2 std::cout << " hello world " << number << std::endl;
3 }
4
5 int main () {
6 // 建立新的Lua环境
7 lua_State *L = luaL_newstate();
8
9 // 让LuaBind“认识”这个Lua环境
10 luabind::open(L);
11
12 // 添加print_hello函数到Lua环境中
13 luabind::module(L) [
14 luabind::def( " print_hello ", print_hello)
15 ];
16
17 // 现在Lua中可以调用print_hello了
18 luaL_dostring(L, " print_hello(123) ");
19
20 lua_close(L);
21
22 return 0;
23 }
在Lua代码中使用C++类
2 public:
3 NumberPrinter( int number) : m_number(number) {}
4
5 void print() {
6 std::cout << m_number << std::endl;
7 }
8
9 private:
10 int m_number;
11 };
12
13
14 int main () {
15 // 建立新的Lua环境
16 lua_State *L = luaL_newstate();
17
18 // 让LuaBind“认识”这个Lua环境
19 luabind::open(L);
20
21 // 使用LuaBind导出NumberPrinter类
22 luabind::module(L) [
23 luabind::class_<NumberPrinter>( " NumberPrinter ")
24 .def(luabind::constructor< int>())
25 .def( " print ", &NumberPrinter::print)
26 ];
27
28 // 现在Lua中可以使用NumberPinter类了
29 luaL_dostring(L,
30 " Print2000 = NumberPrinter(2000) "
31 " Print2000:print() "
32 );
33
34 lua_close(L);
35
36 return 0;
37 }
参考资料