2012-05-07 10 views
6

私はSWIG(Pythonをターゲットとして)でライブラリをラッピングしています。ライブラリ関数にはデータ型 "uint32_t"、 "uint8_t"などのパラメータが含まれています。可能な限りクロスプラットフォームとしてインターフェイスを作成したいので、私のinterface.iファイルに元の関数シグネチャを使用します。たとえば:SWIGとのクロスプラットフォームインターフェイスの生成方法は?

uint32_t func(uint32_t a, uint32_t b); 

私が解決しようとしている問題はuint32_tデータ型にtypedefがない限りSWIGは整数としてパラメータを認識しないということです。

typedef unsigned uint32_t; 

typedefラインは、Pythonバインディングターゲットから呼び出し可能ではない機能を引き起こすことの削除:

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

以前typedef OKにされた今、私は、インターフェイスファイルでこれを使用しています私のローカルマシンですが、別のコンパイラ/プラットフォームでは異なるかもしれません。ディレクティブを使用して%include "stdint.h"はSWIGにエラーが発生します:

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

をWICHはSWIGは、フル機能のコンパイラではありませんので、理にかなって、完全にそのヘッダ上のすべての#ifdefを評価することはできません。

コンパイラがstdint.hヘッダーで選択しているデータ型でSWIGを正しくフィードするにはどうすればよいですか?実際には、正確なデータ型を厳密に適用する意味がありますか、またはtypedefすべてをintX_tからlongにすることはOKですか?

答えて

11

あなたはSWIGインタフェースファイルでこれらの型を使用したい場合は、あなたが何か行うことができます:既存のSWIGである

%module test 
%include "stdint.i" 

uint32_t my_function(); 

をインターフェイスには、ご使用のシステムの正しいtypedefがあります。

0

uint32_tはクロスプラットフォームではなくクロスコンパイラであるため、typedefを強制する必要があります。 uint32_tはC99標準ですが、多くのコンパイラはこの標準を完全に実装しないことに決めました。 あなたは、クロスコンパイラの方法であなたのプロジェクトタイプを再定義するために含めることができます:私は上記のリンクヘッダの導入を読み取るために価値がある

http://www.azillionmonkeys.com/qed/pstdint.h

。あなたはstdint.hの代わりにこのインクルードを使うことができます。

ます。また、この質問を読むことができます:

Cross-platform primitive data types in C++

関連する問題