lua和C交互框架
1、错误(err_return)的宏定义
#define err_return(num,fmt,args) \
do
{
printf("[%s:%d]"fmt"\n",__FILE__,__LINE__,##args);return(num);
} while(0)
-1 是return的返回值,表示有错误;
fmt 是一个字符串,用于打印错误信息;
args表示参数的个数;--这个有疑问,__FILE__,__LINE__,##args 是什么意思?
另外: while(0)是什么意思,什么条件下可以退出?
具体调用实例:err_return(-1,"luaL_newstat() failed",1);
补充解释:
//__FILE__ 进行编译的源文件名
//__LINE__ 文件当前有的行号(注意:是"当前")
//__DATE__ 文件被编译的日期
//__TIME__ 文件被编译的时间
##是字符拼接
像这样
在#define中,标准只定义了#和##两种操作。#用来把参数转换成字符串,##则用来连接两个前后两个参数,把它们变成一个字符串。 eg.ab##cd 就是abcd, m##1 就是m1;
另外: while(0)是什么意思,什么条件下可以退出?
直接退出,0为false
0是false所以只执行一次do就退出了
while()循环进入的条件是,条件为TRUE,因为0是FALSE,所以循环一次就退出;
do~while() 循环执行一次do里面的内容然后退出,如果直接是while()循环,则不会进入循环体;
2、在lua中调用C函数:
(1)C中写好lua要调用的函数
//lua中要调用的c函数定义,实现加法
int csum(lua_State* l) //定义函数,函数参数是lua_State* l,这也是每个lua要调用的C函数的写法;
{
int a = lua_tointeger(l,1) ; //lua_tointeger()获得整型返回值,一般是把lua传进去的数值(参数或者全局变量)转换成整形;
int b = lua_tointeger(l,2) ; //这里是指第二个参数,被转化成整形;
lua_pushinteger(l,a+b) ; //lua_pushinteger()这里是把返回值(a+b)压入栈
return 1 ; //返回值的数量;
}
可见,lua调用C函数,首先是要写好C中的函数的,首先把函数参数转化成想要的类型,然后把返回值表达式压
相关文档:
下面用到的方法叫辗转相除法,具做步骤如下
先用小的一个数除大的一个数,得第一个余数;
再用第一个余数除小的一个数,得第二个余数;
又用第二个余数除第一个余数,得第三个余数; &nb ......
一、概述
谈到在linux系统下编写I2C驱动,目前主要有两种方式,一种是把I2C设备当作一个普通的字符设备来处理,另一种是利用linux I2C驱动体系结构来完成。下面比较下这两种驱动。
第一种方法的好处(对应第二种方法的劣势)有:
● 思路比较直接,不需要 ......
当读者有一定c/c++基础
推荐的阅读顺序:
level 1
从<<essential c++>>开始,短小精悍,可以对c++能进一步了解其特性
以<<c++ primer>>作字典和课外读物,因为太厚不可能一口气看完
level 2
然后从<<effective c++>>开始转职,这是圣经,请遵守10诫,要经常看,没事就拿来翻翻
......
内存控制篇
calloc
free
getpagesize
malloc
mmap
munmap
calloc(配置内存空间)
相关函数
malloc,free,realloc,brk
表头文件
#include <stdlib.h>
定义函数
void *calloc(size_t nmemb,size_t size);
函数说明
calloc()用来配置nmemb个相邻的内存单位,每一单位的大小为size,并返回指向第 ......