2012-09-04 40 views
1

我想在PHP中使用我的C++类。在我的C++代码,我宣布的typedef为:SWIG typedef recognition

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 

P.S:我还在我的界面文件中包含“stdint.i”,但得到了相同的错误

任何想法?

+0

非常感谢您Flexo;) – A23149577

回答

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. 。而不是用自己的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提供的工具类来保存和包装一个纯粹的C阵列byte s。

+0

非常感谢您的帮助,现在工作正常,我在PHP代码中遇到了错误,并且我的字节类型被PHP识别。 – A23149577