1

我也在尝试在 PHP 中使用我的 C++ 类。在我的 C++ 代码中,我将 typedef 声明为:

typedef unsigned char byte;

所以我打算让 SWIG 在包装类中考虑我的 typedef,我的接口文件是这样的:

%module xxx

typedef unsigned char byte;

%include "xxx.h"

....

%{

typedef unsigned char byte;

#include "xxx.h"

%}

在我的测试代码中,我将类型称为:

byte *data;

但我有以下错误:

Fatal error: Class 'unsigned_char' not found in xxx.php

PS:我还在我的接口文件中包含“stdint.i”但得到了同样的错误

有任何想法吗?

4

1 回答 1

0

我可以确认您显示的界面是可行的并且适用于简单的情况,例如我编写了以下头文件进行测试:

byte *make() { return NULL; }
void consume(byte *data) {}

并使用了界面:

%module xxx

typedef unsigned char byte;

%include "xxx.h"

%{
typedef unsigned char byte;

#include "xxx.h"
%}

我能够使用以下 PHP 进行编译和测试:

<?php
include("xxx.php");
$r = xxx::make();
xxx::consume($r);
?>

它按预期工作。

不过有几点需要注意:

  1. 一般来说,我倾向于编写您想要传递给模块的代码(%{ %}%include.
  2. byte我倾向于使用标准的 int 类型之一,而不是使用您自己的 typedef ,例如uint8_t
  3. 从您的问题中不清楚您打算如何使用byte *data- 大概它是一个数组,在这种情况下,您需要在界面中添加更多代码。(或者更好地使用std::vector<byte>,因为它是 C++):

    %module xxx
    
    %{
    typedef unsigned char byte;
    
    #include "xxx.h"
    %}
    
    %include <carrays.i>
    
    %array_class(byte,ByteArray);
    
    typedef unsigned char byte;
    
    %include "xxx.h"
    

    然后可以在 PHP 中用作:

    $a = new ByteArray(100);
    $a->setitem(0, 1);
    $a->setitem(1, 2); //...
    xxx::consume($a->cast());
    

    ByteArray是 SWIG 提供的实用程序类,用于保存和包装bytes 的原始 C 数组。

于 2012-09-04T07:54:20.010 回答