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. 独自の 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());
    

    ByteArrays の生の C 配列を保持およびラップするために SWIG によって提供されるユーティリティ クラスbyteです。

于 2012-09-04T07:54:20.010 に答える