2012-05-07 21 views
6

Bir kitaplığı SWIG (hedef olarak Python) ile kaydediyorum. Kütüphane fonksiyonları "uint32_t", "uint8_t" vb. Veri tiplerini içerir. Arabirimi mümkün olduğunca çapraz platform olarak oluşturmak istiyorum, bu yüzden interface.i dosyamdaki orijinal işlev imzalarını kullanmak istiyorum. Örneğin:SWIG ile çapraz platform arabirimi nasıl oluşturulur?

uint32_t func(uint32_t a, uint32_t b); 

Ben çözmeye çalışıyorum sorun uint32_t veri türü üzerinde typedef olmadıkça yudum bir tamsayı olarak parametreyi tanımayacaktır olmasıdır.

typedef unsigned uint32_t; 

typedef satırı Python bağlayıcı hedeften çağrılabilir olmamaya işlevini neden olacağını Çıkarma:

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

önceki typedef Tamam üzerinde olan Şu anda arayüzü kayıtlı bu kullanıyorum yerel makinem, ancak başka bir derleyici/platformda farklı olabilir. yönergesini %include "stdint.h" kullanma yudum bir hata yükseltecek: yudum tam özellikli derleyici değildir ve tam olarak bu başlıktan tüm #ifdef değerlendiremez beri

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

Wich mantıklı.

SWIG, derleyicinin stdint.h üstbilgisinde seçtiği veri türleriyle doğru bir şekilde nasıl besleyebilirim? Aslında, doğru veri tiplerini tam olarak uygulamak için mantıklı mıdır, yoksa sadece typedefintX_t'un long'a girmesi tamam mı?

cevap

11

Eğer böyle bir şey yapabilirsiniz senin yudum arayüzü dosyasında bu tür kullanmak isterseniz: Varolan yudum olduğunu

%module test 
%include "stdint.i" 

uint32_t my_function(); 

Arabirim, sisteminiz için doğru typedef s değerine sahiptir.

0

Uint32_t çapraz platform değil çapraz derleyici olmadığı için typedef'i zorlamalısınız. uint32_t C99 standardıdır, ancak birçok derleyici bu standardı tamamen uygulamaya karar vermemiştir. Bir çapraz derleyici şekilde proje türlerini yeniden tanımlamak için dahil olabilir: Ben yukarıda bağlantılı başlığının giriş okumaya değer

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

. Bunu stdint.h yerine kullanabilirsiniz.

Ayrıca bu soruyu okuyabilir:

Cross-platform primitive data types in C++

İlgili konular