aardio 文档
aardio 范例: 调用 C 语言函数
//aardio 调用 C 语言函数
import console;
import tcc;
var c = tcc();
c.enableIoPrintf(); //启用 io_print 函数
c.code = /****
#include <stdio.h>
#include <stdlib.h>
//C99 __VA_ARGS__ 默认至少匹配1个参数,匹配0个参数时,需要用 ## 去掉前面的逗号
#define dprintf(level, ...) io_printf(__VA_ARGS__)
typedef struct {
int x;
int y;
} Point;
int helloW (char a,int b, unsigned long long c,Point * ppt,Point pt,double * pd)
{
io_printf("C语言接收到参数 a: %d b:%d c: %llu ppt->x: %d ppt->y:%d pt.x: %d pt.y:%d pd:%g\n",a,b,c,ppt->x,ppt->y,pt.x,pt.y,*pd);
int n = 10;//变量声明可以放函数中间
long long ln = 100;//64位整数(也就是aardio中的long),C99
char s[n]; //变长数组,C99 VLA
//C99标准引入了Designated Initializers特性使得数组、结构体和联合体的初始化更加灵活和方便。
struct { int x, y; } st[10] = { [0].x = 1, [0].y = 2 };
int tab[10] = { 1, 2, [5] = 5, [9] = 9};
//C99 compound literal
int *p = (int []){ 1, 2, 3 };
//GCC 数组初始化
struct { int x, y; } st2 = { x: 1, y: 1};
struct { int x, y; } st3 = { .x = 1, .y = 1};
//GCC case ranges
int v = 2;
switch(v) {
case 1 ... 9:
io_printf("range 1 to 9\n");
break;
default:
io_printf("unexpected\n");
break;
}
//GCC __attribute__语句
int a2 __attribute__ ( ( aligned(8) ) );
//参考: https://bellard.org/tcc/tcc-doc.html
return 0;
}
****/
//声明C函数,与声明 API 类似
//https://www.aardio.com/zh-cn/doc/library-guide/builtin/raw/api.html
var helloW = c.getCdecl("helloW","void(byte a,int b,LONG c,struct ppt,int pt_x,int pt_y,double &pd)")
helloW(1,2,3,{int x = 4;int y = 5},6,7,8.1);
//也可以不声明,直接调用C函数,与直接调用 API 的规则相同
var ret,ppt,pd = c.helloW(
1,//小于32位的整型数值可以直接传递,自动兼容
2,//32位整型数值可以直接传递,自动兼容
math.size64(3), //无符号64位整数,可以传 math.size64 对象
{int x = 4;int y = 5}, //aardio 在API参数中传结构体,总是传结构体指针,
6,7, //直接在参数中用结构体传值极其罕见,类似这种字段为32位长的结构体字段可以直接展开为多个参数
{double v = 8.1} //对等C中的 double * 这种指针,在 aardio 中转换为同类型的结构体指针即可
);
console.log( "C函数返回值", ret )
/*
如果C函数的参数使用了 double,float 等浮点数值参数(传值,而不是使用指针传址),
则必须先声明再调用,不声明直接调用无法支持这类参数。
相关文档:
https://www.aardio.com/zh-cn/doc/library-guide/builtin/raw/directCall.html
*/
console.pause();
Markdown 格式