9

SWIG (ターゲットとして Python) でライブラリをラップしています。ライブラリ関数には、データ型「uint32_t」、「uint8_t」などのパラメーターが含まれています。インターフェイスをできるだけクロスプラットフォームとして作成したいので、interface.iファイルで元の関数シグネチャを使用したいと考えています。例えば:

uint32_t func(uint32_t a, uint32_t b);

typedef私が解決しようとしている問題は、uint32_tデータ型に a がない限り、SWIG がパラメーターを整数として認識しないことです。現在、インターフェースファイルでこれを使用しています:

typedef unsigned uint32_t;

その行を削除するとtypedef、ターゲットの Python バインディングから関数を呼び出せなくなります。

>>> mylib.func(2, 2)
TypeError: in method 'func', argument 1 of type 'uint32_t'

前のtypedefものは私のローカル マシンでは問題ありませんが、別のコンパイラ/プラットフォームでは異なる場合があります。ディレクティブ%include "stdint.h"を使用すると、SWIG でエラーが発生します。

/usr/include/stdint.h:44: Error: Syntax error in input(1).

SWIGはフル機能のコンパイラではなく、#ifdefそのヘッダーのすべてを完全に評価できないため、これは理にかなっています。

stdint.hコンパイラがヘッダーで選択しているデータ型を SWIG に正しく供給するにはどうすればよいですか? 実際、正しいデータ型を厳密に強制することは理にかなっていますか、それともto をtypedefすべて ing するだけで問題ありませんか?intX_tlong

4

1 に答える 1

15

SWIGインターフェイスファイルでこれらのタイプを使用する場合は、次のようにすることができます。

%module test
%include "stdint.i"

uint32_t my_function();

これは既存のSWIGインターフェースであり、typedefシステムに適したものがあります。

于 2012-05-07T09:12:46.333 に答える