国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++利用LuaIntf調用Lua的方法示例

2020-05-23 13:39:58
字體:
來源:轉載
供稿:網友

C++利用LuaIntf調用Lua

本文主要介紹了C++利用LuaIntf調用Lua的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。

void LuaTest::OnResponse(uint32_t uLuaRpcId, const std::string& sRespContent) const{ using LuaIntf::LuaRef; LuaRef require(m_pLuaState, "require"); try {  LuaRef handler = require.call<LuaRef>("client_rpc_response_handler");  handler.dispatchStatic("handle", uLuaRpcId, sRespContent); } catch (const LuaIntf::LuaException& e) {  std::cerr << "Failed to call lua client_rpc_response_handler.handle(), "   << e.what() << std::endl; }}

這是測試客戶端代碼,可以寫Lua代碼測試服務器.

Lua代碼中發出一個Rpc請求時, 會在Lua中保存一個回調, 待收到應答時觸發回調. 通過uLuaRpcId來索引該回調.

sRespContent 是收到的應答包, 將在lua中解包.

OnResponse() 就是調用了 Lua 代碼:

require("client_rpc_response_handler").handle(uLuaRpcId, sRespContent)

利用lua-intf來調用C++函數

這里主要是在windows利用VS2015完成,首先是配置lua環境,包含lua的頭文件,連接器里面鏈接lua的靜態庫,然后就是包含lua-intf的代碼,具體如下表

C++,調用lua,調用lua函數,lua,函數調用

需要注意的是:lua-intf_d6f17a是一個包含lua-intf的目錄。

lua-intf的代碼在github上可以下載:https://github.com/SteveKChiu/lua-intf

如何使用看他的README.md

這里我們主要是測試綁定C++類中的函數,工程目錄結構如下

main.cpp代碼如下

#include <iostream> #include <lua.hpp> #include <LuaIntf/LuaIntf.h> #include <string>  const char SCRIPTS_DIR[] = "../scripts";  using namespace std;  struct lua_State;  class TestLog { public:  static TestLog *getInstance()  {   static TestLog instance;   return &instance;  }   ~TestLog();  void Log(const string &str);  void BindLua(lua_State *l);  private:  TestLog();   };  TestLog::TestLog() { }  TestLog::~TestLog() { }  void TestLog::Log(const string &str) {  cout << str << endl; }  namespace {  using LuaRef = LuaIntf::LuaRef;   void LuaLog(const string &str)  {   TestLog::getInstance()->Log(str);  }   namespace LuaTestLog  {   void Bind(lua_State* L)   {    assert(L);    LuaIntf::LuaBinding(L).beginModule("c_testlog")     .addFunction("log", &LuaLog)     .endModule();   }  }; };  void TestLog::BindLua(lua_State *l) {  LuaTestLog::Bind(l); }  int main() {  lua_State *l = luaL_newstate();  luaL_openlibs(l);  TestLog::getInstance()->BindLua(l);  cout << "mmmmmmmmmmm" << endl;  luaL_dofile(l, "test.lua");  system("pause");  return 0; } 

log.lua代碼如下:

local Log = {}  local log = c_testlog.log  function Log:new(log_name)  assert("table" == type(self))  assert(not log_name or "string" == type(log_name))  local log = {}  log.log_name = log_name or "Log"  setmetatable(log, self)  self.__index = self  return log end  function Log:set_log_name(log_name)  self.log_name = log_name end  function Log:info(pattern, ...)  log(string.format(pattern, ...)) end  function Log:debug()  print("ssssssssssssssssssssssssss") end  return Log 

test.lua代碼如下:

local function main()   print("dddddddddddddddddddddddd")  local p = "../testLuaIntf"  package.path = package.path ..";" .. p .. "/" .. "testLuaIntf" .. "/?.lua"  --package.path = package.path .. "E:/VSProject/?.luac"   print("bbbbbbbbbbbbbbbbbbbbbbbbbbbbb")   local log = require("log"):new("svn_log")  log:info("%d...",1)    --:new("svc_log")  print("ssssssssssssssssssssssss")   end   xpcall(main,function(...) local msg = {...}; for k ,v in pairs(msg) do print("k=" .. tostring( k) .. " v=" .. tostring(v))  end print(tostring() .. " 123") end) 

這里流程通過C++調lua的接口luaL_dofile(l, "test.lua");來執行test.lua,test.lua中require("log"),然后lua再調用C++的函數Log完成打印

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 武陟县| 射阳县| 黑水县| 牙克石市| 玉山县| 浦城县| 霸州市| 澜沧| 洞头县| 新郑市| 巫溪县| 曲靖市| 贵州省| 江北区| 依兰县| 汽车| 阿合奇县| 南和县| 赤壁市| 呼伦贝尔市| 肥城市| 阿荣旗| 武陟县| 武穴市| 旬邑县| 武定县| 高邑县| 长岭县| 西乡县| 临夏市| 新兴县| 旌德县| 舟曲县| 谷城县| 潮安县| 北京市| 溆浦县| 白朗县| 景洪市| 岑巩县| 屯昌县|