7

我在 C 中有一些代码可以进行一些硬件访问。此代码已准备好并经过良好测试。现在我想实现一个 Web 界面来控制这个硬件。所以我和 Zephir 一起进行了 PHP 扩展开发。

我的问题是,“Zephir 是否可以包含一个外部库 resp。链接反对它?“如果可能的话,我该怎么做?

4

1 回答 1

9

是的,这是可能的,并且有两种使用 C 代码的方法。

通过将 C 代码包装在 CBLOCK 中

您可以在标签中嵌入 c 代码,如下所示%{ // c-code }%

此功能未记录在案,但存在于测试中。

https://github.com/phalcon/zephir/blob/master/test/cblock.zep https://github.com/phalcon/zephir/blob/c47ebdb71b18f7d8b182f4da4a9c77f734ee9a71/test/cblock.zep#L16 https://github。 com/phalcon/zephir/blob/c47ebdb71b18f7d8b182f4da4a9c77f734ee9a71/ext/test/cblock.c

%{
    // include a header
    #include "headers/functions.h"

    // c implementation of fibonacci
    static long fibonacci(long n) {
        if (n < 2) return n;
        else return fibonacci(n - 2) + fibonacci(n - 1);
    }

}%

看起来有点难看,但很有效,)更优雅,但也更多的工作是自定义优化器:

通过编写自定义优化器

“优化器”就像函数调用的拦截器一样工作。“优化器”通过直接 C 调用替换 PHP 用户空间中对函数的调用,这些调用更快且开销更低,从而提高了性能。

可以使用干净的接口编写优化器,让 Zephir 知道传递给 C 函数的参数类型和返回的数据类型。

手册:https ://docs.zephir-lang.com/en/latest/optimizers.html

示例(调用斐波那契 c-func):https ://github.com/phalcon/zephir/pull/21#issuecomment-26178522

于 2014-10-13T00:05:44.643 回答