我尝试过使用我的C ++类的PHP。 在我的C ++代码,我宣布的typedef为:
typedef unsigned char byte;
所以我打算让痛饮考虑我的包装类的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”在我的接口文件,但得到了同样的错误
有任何想法吗?
我可以证实,还有你的界面是可行的,适用于简单的情况下,例如我写了下面的头文件进行测试:
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);
?>
和它的工作如预期。
有几点从,虽然注意:
- 一般来说,我会倾向于写你想通过传递到模块的代码(即内部位
%{ %}
您之前%include
。 - 而不是用自己的typedef
byte
我会倾向于使用标准的int型,例如一个uint8_t
这不是从你的问题清楚你很打算如何使用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保持和包裹的纯粹的C阵列的工具类byte
秒。