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中的函数的,首先把函数参数转化成想要的类型,然后把返回值表达式压
相关文档:
extern "C"
extern "C" 包含双重含义,从字面上即可得到:首先,被它修饰的目标是“extern”的;其次,被它修饰的目标是“C”的。让我们来详细解读这两重含义。
(1) 被extern "C"限定的函数或变量是extern类型的;
extern是C/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满足条件 ......
1、C/C++程序员请注意,不能在case语句不为空时“向下执行”。
2、值类型和引用类型之间的区别:C#的基本类型(int,char等)都是值类型,是在栈中创建的。而对象是引用类型,创建于堆中,需要使用关键字new。
3、在C#中通过实例访问静态方法或成员变量是不合法的,会生成编译器错误。但是我们可以通过声明他们 ......