加强企业网站建设作用,国外空间网站源码,网络营销与推广书籍,企业文化管理咨询系列文章目录
lua调用C/C的函数#xff0c;十分钟快速掌握 C调用lua脚本#xff0c;包括全局函数绑定、类绑定#xff0c;十分钟快速掌握 系列文章目录摘要环境使用步骤码代码自定义函数多返回值变长参数 自定义类test_sol2.lua内容 程序输出 摘要
在这个快节奏的技术博客…系列文章目录
lua调用C/C的函数十分钟快速掌握 C调用lua脚本包括全局函数绑定、类绑定十分钟快速掌握 系列文章目录摘要环境使用步骤码代码自定义函数多返回值变长参数 自定义类test_sol2.lua内容 程序输出 摘要
在这个快节奏的技术博客中我们将借助sol2库以十分钟的时间快速掌握如何在C中调用Lua脚本。sol2是一个轻量级的Lua绑定库它简化了C与Lua之间的交互使得全局函数和类的绑定变得异常简便。我们将创建几个”复杂的“函数变长参数、多返回值和一个具有几个成员函数的简单类通过sol2的简洁语法只需几行代码我们就能将C函数绑定到Lua环境中实现跨语言调用。
为了快速输出我们要讲的内容我不仅提供了实际的示例代码还将解释每一步的操作确保能够迅速理解并运用这一技术。通过这十分钟的快速掌握希望将能够在项目中充分发挥C与Lua的优势实现更灵活、高效的代码编写。无论是全局函数的调用还是类的绑定sol2为C与Lua的融合提供了一种极具便利性和效率的解决方案。
环境
工具\组件版本说明Windows10visual studio2022lua5.4sol23.2.3C17sol2需要
使用步骤
lua头文件和静态链接库或者动态库从官方网站下载预编译好的即可当然如果你有自定义需求也可自行修改编译。
引入sol2头文件从github上下载。
# 就是这三个文件要按此层次结构放好。
│ sol.hpp
│
└─solconfig.hppforward.hppvisual studio新建个项目C语言标准设置为C17。
加入头文件和库文件到项目中。
接下来就是码代码了。 码代码
自定义函数
多返回值
通过使用sol2我们不需要自己再写包装方法这一下就省了不少代码。
std::tupleint,const char*, double multipleResultFunc(int a, const char* b, double c)
{//return std::tupleint, char*, double(a, b, c);return std::make_tuple(a, b, c);
}变长参数
int variaArgs(sol::variadic_args va)
{int r 0;for (auto v : va){r static_castint( v);}return r;
}自定义类 class my_class{private:std::string m_str;public:int b 24;int f() const{return 24;}void g(){b;}void setTitle(const char* str){this-m_str str;}void print(){std::cout this-m_str , this-b std::endl;std::wcout this-rowname L , typeid( this-columns).name() std::endl;}}#define SOL_CHECK_ARGUMENTS 1
#include sol.hppsol::state lua;lua.open_libraries(sol::lib::base);// bark namespacing in Lua// namespacing is just putting things in a tablesol::table bark lua.create_named_table(bark);bark.new_usertypemy_class(my_class,f, my_class::f,g, my_class::g,setTitle, my_class::setTitle,print, my_class::print//,//putUnsetValue, my_class::putUnsetValue//,//setSome, my_class::setSome); // the usuallua.set_function(multipleResultFunc, multipleResultFunc);lua.set_function(variaArgs, variaArgs);// load and execute from filelua.script_file(test_sol2.lua);
test_sol2.lua内容
obj bark.my_class.new()
obj:g()
local result obj:f()
obj:setTitle(I am Tom , and you ?)
print()
obj:print()bark.print_my_class(obj)
print(result)print(bark.add_two_number(1,2))mr, mr2, mr3 multipleResultFunc(11, Jerry, 123.45)
print(mr, mr2, mr3)
print(mr)print(call variable args function, 1, 2, 3, 4)
local r variaArgs(1,2,3,4)
print(variaArgs, r)程序输出 namespacing
I am Tom , and you ? , 25, class std::vectorunsigned long,class std::allocatorunsigned long
my_class { b: 25 }
24
3
11 Jerry 123.45
11
call variable args function 1 2 3 4
function: 0102B030 10
C source output Your name is Michael, and 2323 years old.