C绑定

在Felix中,可以使用C绑定来从C和C++中提升类型。由此产生的命名类型是抽象的。除非另有说明,否则从C或C++中提取的所有类型必须是第一类,即半正则。这意味着这些类型的值可以是默认构造、复制构造、复制指定、移动构造、移动指定和销毁;换句话说,它们的行为“像一个整数”。

要抬起不动的物体,请抬起指针。

提升原语

以下是如何提升原始类型:

type int = "int";
type long = "long";
type ulong = "unsigned long";
type address = "void*";

引用的名称必须在表单中可用 T xT *x . 这意味着您不能提升C函数指针类型,例如 int (*)(double, long) 因为变量名必须位于 * .

起重等级类型

类类型需要更多的工作:

type vector[T] = "::std::vector<?1>"
  requires header "#include <vector>"
;

这里, ?1 annotation表示第一个类型变量,例如 vector[ulong] 电梯 ::std::vector<unsigned long> .

当提升C++类型时,务必总是指定类型的绝对路径名。从 :: 强烈推荐。这避免了生成的代码中可能存在的歧义。

这个 requires 条款 header 选项告诉Felix在使用类型之前,在生成的代码的头文件中发出带引号的文本。如果未使用类型,则 #include 不会发射。

C函数类型

C函数类型可以在Felix中直接定义:

typedef int2int = int --> int;
// typedef int (nt2int*)(int)

类型 int2int 是别名,而C函数类型是结构类型,而不是标称类型。

提升C结构和活接头

C结构可以以公开其字段的方式提升,前提是字段不是 const

header mypair_h =
"""
  struct mypair { int x; int y; };
""";

cstruct mypair {
  x: int;
  y: int;
} requires mypair_h;

在这里,为了使代码完整,C定义使用浮动头代码,因此绑定可能需要它。通常,它将在头文件中给出。

A cstruct 除了不发出定义外,其工作原理与结构完全相同。

有警告!Felix生成通常的elementwise构造函数,但它将导致损坏,除非 cstruct Felix中类型的模型与C中的定义完全匹配,但是访问字段组件不需要这样做。尤其是 cstruct Felix中的构造也可以用来为C联合建模。

不能为C类型指定命名空间或类限定。

起重功能和程序

由于从C中提取的基元类型是抽象的,我们也必须能够用C绑定来定义对它们的操作。

proc push_back[V]: &vector[V] * V = $1->push_back($2);";
fun front[V]: vector[V] -> V = "$1.front()";

var v : vector[int];
push_back (&v, 42);
println$ v.front; // 42

我们使用 $1 阿布德 $2 分别fir第一个和第二个参数。

提升常数和表达式

可以使用 const 活页夹:

const pi : double = "M_PI" requires C99_headers::math_h;

提升枚举

有一种特殊的速记可用于提升C枚举,用于序列:

cenum color = red,blue,green;

这(大致)相当于:

type color = "color";
const red: color = "red";
const blue: color = "blue";
const green: color = "green";
fun == : color * color -> bool = "$1==$2";

特别注意等式是自动定义的。这是在模式匹配中使用枚举值所必需的。

举旗

有一种特殊的速记可用于提升C枚举,用于标记:

cflags color = red,blue,green;

这定义了cenums的相等性,但也使所有标准的位操作可用。