Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ luaapi-加载多个具有相同名称的变量和函数的文件_C++_Lua_Embedded Language - Fatal编程技术网

C++ luaapi-加载多个具有相同名称的变量和函数的文件

C++ luaapi-加载多个具有相同名称的变量和函数的文件,c++,lua,embedded-language,C++,Lua,Embedded Language,假设我有两个Lua文件,我将使用标准Lua C API,它们共享一个公共库: 普通卢阿 function printHello(name) print("Hello from " .. name) end file1.lua require "common" local scriptName = "file1" function doSomething() printHello(scriptName) end file2.lua require "common" local

假设我有两个Lua文件,我将使用标准Lua C API,它们共享一个公共库:

普通卢阿

function printHello(name)
    print("Hello from " .. name)
end
file1.lua

require "common"
local scriptName = "file1"

function doSomething()
    printHello(scriptName)
end
file2.lua

require "common"
local scriptName = "file2"

function doSomething()
    printHello(scriptName)
end
现在假设我想让两个文件*.lua文件共享相同的
lua\u状态
在不更改任何Lua代码的情况下,如何加载文件,以便调用特定的
doSomething()

是否有一种方法可以将加载文件(函数、变量、表)中的“所有内容”移动到
lua\u状态下的全局表中,并使用脚本名(或任何内容)作为键?另外,是否有一种方法可以让file1.lua和file2.lua共享common.lua的“内存”版本

我正在使用Lua5.1


谢谢

以下是在纯Lua 5.1中的实现方法:

file1_env=setmetatable({},{{uuu index=\u G})
本地file1\u chunk=loadfile('file1.lua')
setfenv(文件1_块,文件1_环境)
file1_chunk()
file2_env=setmetatable({},{{uu index=\u G})
本地file2\u chunk=loadfile('file2.lua')
setfenv(文件2_块,文件2_环境)
file2_chunk()
file1_env.doSomething()--打印“来自file1的Hello”
file2_env.doSomething()--打印“来自file2的Hello”
所发生的事情是,您正在更改每个文件块运行的环境,因此,它们不是将它们的
doSomething
函数放在全局环境中,从而相互践踏,而是放在自己的本地环境中(它使用一个元表,这样他们就可以使用全局环境中的东西,比如
require
print
)。根据请求,
common.lua
只需运行一次,如果在它的末尾放上类似
printHello('common')

如果您想从C执行此操作,我使用的所有功能都可以直接转换为C API,如下所示:

#包括
#包括
#包括
内部主(空){
lua_State*L=luaL_newstate();
luaL_openlibs(L);
/*堆栈是空的*/
lua_创建表(L,0,1);
/*-1:file1_env*/
lua_创建表(L,0,1);
/*-2:file1\u env,-1:file1\u env\u mt*/
lua_pushvalue(L,lua_GLOBALSINDEX);
/*-3:file1\u env,-2:file1\u env\u mt,-1:*/
lua_设置域(L,-2,“_索引”);
/*-2:file1\u env,-1:file1\u env\u mt*/
lua_可设置元表(L,-2);
/*-1:file1_env*/
luaL_加载文件(L,“file1.lua”);
/*-2:file1\u环境,-1:file1\u区块*/
lua_值(L,-2);
/*-3:file1_env,-2:file1_chunk,-1:file1_env*/
卢厄·塞芬夫(L,-2);
/*-2:file1\u环境,-1:file1\u区块*/
lua_调用(L,0,0);
/*-1:file1_env*/
lua_setglobal(L,“文件1_env”);
/*堆栈是空的*/
lua_创建表(L,0,1);
/*-1:file2_env*/
lua_创建表(L,0,1);
/*-2:file2\u env,-1:file2\u env\u mt*/
lua_pushvalue(L,lua_GLOBALSINDEX);
/*-3:file2\u env,-2:file2\u env\u mt,-1:*/
lua_设置域(L,-2,“_索引”);
/*-2:file2\u env,-1:file2\u env\u mt*/
lua_可设置元表(L,-2);
/*-1:file2_env*/
luaL_加载文件(L,“file2.lua”);
/*-2:file2\u环境,-1:file2\u区块*/
lua_值(L,-2);
/*-3:file2_env,-2:file2_chunk,-1:file2_env*/
卢厄·塞芬夫(L,-2);
/*-2:file2\u环境,-1:file2\u区块*/
lua_调用(L,0,0);
/*-1:file2_env*/
lua_setglobal(L,“文件2_env”);
/*堆栈是空的*/
lua_getglobal(L,“文件1_env”);
/*-1:file1_env*/
lua_getfield(L,-1,“剂量测定”);
/*-2:file1_env,-1:file1_env.doSomething*/
lua_调用(L,0,0);
/*-1:file1_env*/
卢厄波普(L,1);
/*堆栈是空的*/
lua_getglobal(L,“文件2_env”);
/*-1:file2_env*/
lua_getfield(L,-1,“剂量测定”);
/*-2:file2_env,-1:file2_env.doSomething*/
lua_调用(L,0,0);
/*-1:file2_env*/
卢厄波普(L,1);
/*堆栈是空的*/
卢厄关闭(L);
返回0;
}

在Lua 5.1和5.2之间,您执行此操作的方式发生了很大变化。您使用的Lua的确切版本是什么?@JosephSible 5.1。我也更新了这个问题。如果您定义局部函数并返回它们,而不是定义全局变量和依赖全局环境的游戏,您的生活会轻松得多。您可以我通过实现您自己的
require
\u G
分离到每个
文件*.lua
中。
\u G1
\u G2
都将继承标准lua globals和由
common.lua
@Addy创建的globals。这可能是一个新问题。在C API中,我是否应该保存相应的
文件1\u env
file2_env1
到一个全局表中,这样我就可以根据需要检索它们了?我不明白如何
localfile1_env=setmetatable({},{{{{uu index={u G})
localfile1_env=setmetatable({},{uu index={u G})
translate to C API?我如何通过C API将文件加载到变量中?@Addy我刚刚编辑了《如何在C中执行相同的操作》。这将非常有用。非常感谢。