易截截图软件、单文件、免安装、纯绿色、仅160KB

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中的函数的,首先把函数参数转化成想要的类型,然后把返回值表达式压


相关文档:

C/C++语言void及void指针深层探索

C/C++语言void及void指针深层探索
1.概述
许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误。本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧。
2.void的含义
void的字面意思是“无类型”,void *则为“无类型指针”,void ......

实例解析linux内核I2C体系结构

一、概述
谈到在linux系统下编写I2C驱动,目前主要有两种方式,一种是把I2C设备当作一个普通的字符设备来处理,另一种是利用linux I2C驱动体系结构来完成。下面比较下这两种驱动。
第一种方法的好处(对应第二种方法的劣势)有:
        ●    思路比较直接,不需要 ......

The meaning of the c in calloc

The meaning of the c in calloc was vividly discussed in comp.lang.c in October 2000 (see here), with both clear (because, unlike malloc, calloc clears the memory it returns) and count (because, unlike malloc, calloc is passed a count of elements to allocate) suggested as possible explanations, howev ......

C小程序(增删改查全面练习)

1.排序小程序:练习排序基本算法和函数的应用,并体味函数用法的好处。
 #include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define DATA 10
int ArrGrounp[ DATA ];
int ArrGrounp1[DATA];
#define DEFINE1 "请输入10个数:\n"
#define DEFINE2 "满足条件的数有:"
#define DEFINE3 "\n满足条件 ......

C#中C/C++程序员注意问题

1、C/C++程序员请注意,不能在case语句不为空时“向下执行”。
2、值类型和引用类型之间的区别:C#的基本类型(int,char等)都是值类型,是在栈中创建的。而对象是引用类型,创建于堆中,需要使用关键字new。
3、在C#中通过实例访问静态方法或成员变量是不合法的,会生成编译器错误。但是我们可以通过声明他们 ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号