//aardio 调用 C 语言 - 结构化参数表 import tcc; var c = tcc(); c.enableIoPrintf(); c.code = /**** #include #include //在C语言中定义 raw.cdeclParameter,注意 aardio 字符串默认为 UTF8 编码 typedef struct{ const char *(__cdecl *getType) (const char * name); void * (__cdecl *getFunction) (const char * name,const char *proto); void (__cdecl *setFunction) (const char * name,const char *proto,void * addr); const char *(__cdecl *getBinary) (const char * name,unsigned int *size); void (__cdecl *setBinary) (const char * name,char * value,unsigned int size); const char *(__cdecl *getString) (const char * name); void (__cdecl *setString) (const char * name,const char * value); void (__cdecl *getNumber) (const char * name,double * value); void (__cdecl *setNumber) (const char * name,double value); unsigned long long (__cdecl *getSize64) (const char * name); void (__cdecl *setSize64) (const char * name,unsigned long long value); void * (__cdecl *getPointer) (const char * name); void (__cdecl *setPointer) (const char * name,void * value); int (__cdecl *callString) (const char * name,const char * arg); int (__cdecl *callNumber) (const char * name,double arg); int (__cdecl *call) (const char * name); unsigned int(__cdecl *len)(const char * name); } aardioParameter; typedef double (*ADDFUNC) (double a,double b); int func_c ( aardioParameter * opt ) { //取参数中的字段值,字段名可以使用命名空间,例如 x.y.z.字段名 const char * s = opt->getString("hello"); io_printf( "Hello! 我是C语言代码\n收到aardio传来的参数:%s\n", s ); //调用参数中包含的函数名 opt->callString("func","参数"); //可以添加C函数为 aardio 函数 opt->setFunction("test.printf","void(string s,int x,int y)",printf); //也以声明aardio中的函数为C函数 int (*add) (int a,int b) = opt->getFunction("test.add","int(int,int)" ); int c = (*add)(12,3); unsigned long long x = opt->getSize64("size" ); io_printf( " LONG64: %I64u\n", x); return 0; } ****/ //创建结构化参数 import console; import raw.cdeclParameter; var cdeclParameter = raw.cdeclParameter( size = ..math.size64(2,1); hello = "测试!"; func = function(参数){ ..console.log("aardio函数被回调了",参数 ) } test = { add = function(a,b){ owner.printf( '在aardio中调用C语言声明的函数 %d %d\n',12,33 ); return a+b } } ) //获取C函数 func_c = c.getCdecl("func_c","int(struct msg)") //调用C函数 func_c( cdeclParameter ) //关闭C语言编译器 c.close(); console.pause();