痛饮的typedef识别(SWIG typedef recognition)

2019-09-22 02:46发布

我尝试过使用我的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”在我的接口文件,但得到了同样的错误

有任何想法吗?

Answer 1:

我可以证实,还有你的界面是可行的,适用于简单的情况下,例如我写了下面的头文件进行测试:

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. 而不是用自己的typedef byte我会倾向于使用标准的int型,例如一个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保持和包裹的纯粹的C阵列的工具类byte秒。



文章来源: SWIG typedef recognition
标签: swig typedef