SWIG typedef识别

时间:2012-09-04 05:45:56

标签: swig typedef

我也试图在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

P.S:我的界面文件中也包含“stdint.i”,但出现了同样的错误

有什么想法吗?

1 个答案:

答案 0 :(得分: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内的位写入。{/ 1}。
  2. 我不想使用你自己的typedef用于byte,而是倾向于使用其中一种标准的int类型,例如: uint8_t
  3. 您的问题并不清楚您打算如何使用byte *data - 大概是一个数组,在这种情况下您需要add a little more code到您的界面。 (或者更好的是仍然使用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提供的实用程序类,用于保存和包装byte s的原始C数组。