使用Lua作为C语言项目的配置文件实例_Lua

想像一个场景:你的c程序需要有一个窗口,你想让用户可以自定义窗口大小。方法很多,比如使用环境变量,或键值对的文件。不管怎样,你需要解析它。使用lua配置文件是个不错的选择。

首先,你可以定义如下的配置文件:

复制代码 代码如下:

--define window size
width = 100
height = 50

然后,我们写个函数来解析它,使用lua API 来指导lua解析配置。,下面是完整的程序:

复制代码 代码如下:

#include <stdio.h>
#include <string.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>

void load(lua_State* L, const char* fname, int *w, int *h)
{
     if (luaL_loadfile(L, fname) || lua_pcall(L, 0, 0, 0)) {
          error(L, "error:%s", lua_tostring(L, -1));
     }
     lua_getglobal(L, "width");
     lua_getglobal(L, "height");
     if (!lua_isnumber(L, -2)) {
          error(L, "width shuld be num.");
     }
     if (!lua_isnumber(L, -1)) {
          error(L, "height shuld be num");
     }
     *w = lua_tointeger(L, -2);
     *h = lua_tointeger(L, -1);
}

int main()
{
     lua_State *L = luaL_newstate();
     luaL_openlibs(L);
     int w, h;
     load(L, "config", &w, &h);
     printf("%d,%d", w, h);
     return 0;
}

使用lua配置文件有什么好处呢?我想,大概有以下理由:
1.Lua为你处理了所有语法细节(包括错误)
2.配置内容可读性好,甚至你可以写上注释。
3.可以很容易添加新的配置信息。
(完)

时间: 2024-10-25 19:55:35

使用Lua作为C语言项目的配置文件实例_Lua的相关文章

Lua与C语言间的交互实例_Lua

Lua 是一门轻巧.灵活.扩展性很强的脚本语言,它可以很容易的嵌入到其他语言(C/C++)中使用,这主要得益于其提供了功能强大的 C API,这让其跟 C/C++ 间的互调成为一件很轻松的事. Lua 调用 C Lua 调用 C 函数,其实就是把 C 函数注册到 Lua 中去,把 C 函数地址传递给 Lua 解释器.这个传递是要遵循一个的协议的,即: 复制代码 代码如下: typedef int (*lua_CFunction)(lua_State* L) Lua 和 C 是通过栈(State)

Lua和C++的通信流程代码实例_Lua

上一章传送门:http://www.jb51.net/article/55088.htm 本章我们来学习一个小Demo,也就是上一章中的场景:C++从Lua中获取一个全局变量的字符串. 1. 引入头文件 我们来看看要在C++中使用Lua,需要些什么东西 复制代码 代码如下: /*    文件名:    HelloLua.h    描 述:    Lua Demo    创建人:    笨木头    创建日期:   2012.12.24 */  #ifndef __HELLO_LUA_H_ #de

Lua和C++语言的交互详解_Lua

前言 写过Windows程序的人都知道,对于应用程序,如果需要在本地保存一些配置信息,我们经常将这些配置信息写在注册表或者本地的配置文件中,很多应用都是将一些配置信息写在配置文件中,比如以ini结尾的文件,这种配置文件很多,使用的很广泛,然后应用程序在启动的时候,就会解析这个配置文件,读取一些配置信息. Lua的一项重要用途就是作为一种配置语言.而这篇文章将结合Lua来扩展应用程序,这种方式提供了更大的灵活性和便利性. 这篇博文主要总结的是使用C++和Lua进行交互,涉及到获取Lua中普通变量的

Openresty服务器使用lua脚本写的Hello World简单实例_Lua

Openresty提供了丰富的接口和变量给Lua,开发者可以充分利用Lua语言特性和这些接口进行高效率开发.万事开头难,但是对于编程来说能写出Hello world就已经算是成功一半了. 1.安装openresty 2.配置nginx 复制代码 代码如下: server {      listen 80;      server_name localhost;        #charset koi8-r;        #access_log logs/host.access.log main

获取Lua表结构(table)数据实例_Lua

只是获取一个全局变量什么的太没意思了,今天我们来玩个高难度的--获取Lua表结构的数据. (旁白:O O!我是不是该说点什么?) 上一章传送门:http://www.jb51.net/article/55093.htm 1. 什么是table table是Lua里最强大的数据类型,我们可以当成是数组,但是它又和数组有点不一样,建议大家看看Lua的语法教程,因为我对table也没有熟悉到可以给大家解释的程度. (旁白:那你还写什么教程...) 2. 获取table变量 现在,我们给helloLua

Linux下编写Lua扩展so文件和调用方法实例_Lua

复制代码 代码如下: #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <errno.h> #include <string.h>   #include <unistd.h> #include <fcntl.h> #include <sys/stat.h> #include <limits.h>   #include

Lua中的迭代器和泛型for实例_Lua

1.迭代器与closure 在lua中,迭代器通常为函数,每调用一次函数,会返回集合中的下一个元素.每个迭代器在成功调用的时候,都需要保存一些状态,closure(闭包)完美为迭代器运用而生. 复制代码 代码如下: function values(t)     local i=0     return function() --匿名函数     i=i+1     return t[i]     end end t1 ={10, 20, 30} it=values(t1)   --创建闭包变量的

把Lua函数传递到C/C++中实例_Lua

问题 在Lua中,因为函数也是第一类值,所以会出现将函数作为另一个函数的参数,或者函数作 为函数的返回值.这种机制在很多地方都能代码更灵活更简洁,例如: 复制代码 代码如下: table.sort(table [,comp]) 这里的comp就要求传入一个函数,我们在调用时,大概会有如下形式: 复制代码 代码如下: table.sort(t, comp) -- 直接写函数名     table.sort(t, local_comp) -- 某个局部函数     table.sort(t, fun

asp.net程序来读取多语言版本Ini配置文件

这是asp.net程序来读取多语言版本Ini配置文件的开发示例,主要分为以下三个部分: 1. Ini 配置文件 2. 读取Ini配置文件的DLL 3. Web页面调用与内容显示 4. 数据库表T_User,如右图 首先说明一下Ini 文件格式:如下图其中[M_Index]节点和该节点下的所有的key和value,其中[M_Index]节点的名称是对应开发示例中的每个页面所在的文件夹名称的第一个字母加下划线再加该页面的名称组合而成,如 M_Index 则表示Manager文件夹下面有一个Index