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

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

C++利用LuaIntf調(diào)用Lua的方法示例

2020-05-23 13:36:17
字體:
供稿:網(wǎng)友

C++利用LuaIntf調(diào)用Lua

本文主要介紹了C++利用LuaIntf調(diào)用Lua的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(xí),下面話不多說了,來一起看看詳細(xì)的介紹吧。

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; }}

這是測(cè)試客戶端代碼,可以寫Lua代碼測(cè)試服務(wù)器.

Lua代碼中發(fā)出一個(gè)Rpc請(qǐng)求時(shí), 會(huì)在Lua中保存一個(gè)回調(diào), 待收到應(yīng)答時(shí)觸發(fā)回調(diào). 通過uLuaRpcId來索引該回調(diào).

sRespContent 是收到的應(yīng)答包, 將在lua中解包.

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

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

利用lua-intf來調(diào)用C++函數(shù)

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

C++,調(diào)用lua,c,調(diào)用lua函數(shù),lua,函數(shù)調(diào)用

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

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

如何使用看他的README.md

這里我們主要是測(cè)試綁定C++類中的函數(shù),工程目錄結(jié)構(gòu)如下

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++調(diào)lua的接口luaL_dofile(l, "test.lua");來執(zhí)行test.lua,test.lua中require("log"),然后lua再調(diào)用C++的函數(shù)Log完成打印

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)VEVB武林網(wǎng)的支持。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 威远县| 凌海市| 五原县| 丰宁| 沂水县| 凤山县| 新巴尔虎左旗| 北流市| 翁牛特旗| 上饶市| 南乐县| 融水| 同江市| 涡阳县| 南昌市| 富裕县| 交口县| 海兴县| 武功县| 许昌市| 申扎县| 兴安盟| 襄城县| 成都市| 房产| 沙河市| 龙海市| 潢川县| 景宁| 东港市| 同德县| 裕民县| 安康市| 珠海市| 璧山县| 阿瓦提县| 云和县| 贞丰县| 靖宇县| 青川县| 车致|