luaL_loadfile()
会加载和编译Lua
脚本,但不会运行。而luaL_dofile
不仅运行编译后的脚本,运行结束后还会把脚本pop
出栈。看下面这个例子:
一个简单的脚本(test.lua
):
print "Hello World!"
首先看调用luaL_loadfile()
的程序:
#include <stdio.h>
#include <stdlib.h>
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
static void stackDump(lua_State *L)
{
int i = 0;
int type = 0;
int top = lua_gettop(L);
printf("There is %d elements in stack: ", top);
for (i = 1; i <= top; i++)
{
type = lua_type(L, i);
switch (type)
{
case LUA_TSTRING:
{
printf("'%s'", lua_tostring(L, i));
break;
}
case LUA_TBOOLEAN:
{
printf(lua_toboolean(L, i) ? "true" : "false");
break;
}
case LUA_TNUMBER:
{
printf("%g", lua_tonumber(L, i));
break;
}
default:
{
printf("Element type is %s", lua_typename(L, type));
break;
}
}
printf(" ");
}
printf("\n");
return;
}
static void bail(lua_State *L)
{
fprintf(stderr, "\nFATAL ERROR:%s\n\n", lua_tostring(L, -1));
exit(1);
}
int main(void)
{
lua_State *L = luaL_newstate();
luaL_openlibs(L);
if (luaL_loadfile(L, "test.lua"))
{
bail(L);
}
stackDump(L);
lua_close(L);
return 0;
}
执行结果:
[root@Fedora test]
There is 1 elements in stack: Element type is function
可以看到,并没有打印“Hello World!
”,而且栈里还有一个类型为function
的元素。
接下来看调用luaL_dofile()
的程序:
#include <stdio.h>
#include <stdlib.h>
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
static void stackDump(lua_State *L)
{
int i = 0;
int type = 0;
int top = lua_gettop(L);
printf("There is %d elements in stack: ", top);
for (i = 1; i <= top; i++)
{
type = lua_type(L, i);
switch (type)
{
case LUA_TSTRING:
{
printf("'%s'", lua_tostring(L, i));
break;
}
case LUA_TBOOLEAN:
{
printf(lua_toboolean(L, i) ? "true" : "false");
break;
}
case LUA_TNUMBER:
{
printf("%g", lua_tonumber(L, i));
break;
}
default:
{
printf("Element type is %s", lua_typename(L, type));
break;
}
}
printf(" ");
}
printf("\n");
return;
}
static void bail(lua_State *L)
{
fprintf(stderr, "\nFATAL ERROR:%s\n\n", lua_tostring(L, -1));
exit(1);
}
int main(void)
{
lua_State *L = luaL_newstate();
luaL_openlibs(L);
if (luaL_dofile(L, "test.lua"))
{
bail(L);
}
stackDump(L);
lua_close(L);
return 0;
}
执行结果:
[root@Fedora test]
Hello World!
There is 0 elements in stack:
可以看到,不仅打印了“Hello World!
”,而且栈也变成了空。
参考资料:
lual_dofile(); wont load script with C++ and Lua。