2012-05-07 9 views
6

Ich wickle eine Bibliothek mit SWIG (Python als Ziel). Die Bibliotheksfunktionen enthalten Parameter mit den Datentypen "uint32_t", "uint8_t" usw. Ich möchte die Schnittstelle so plattformübergreifend wie möglich erstellen, daher möchte ich die ursprünglichen Funktionssignaturen in meiner Datei interface.i verwenden. Zum Beispiel:Wie erstelle ich eine plattformübergreifende Schnittstelle mit SWIG?

uint32_t func(uint32_t a, uint32_t b); 

Die Frage, die ich zu lösen bin versucht, dass SWIG nicht den Parameter als Integer erkennen, es sei denn es eine typedef auf dem uint32_t Datentyp ist. Im Moment benutze ich diese auf der Schnittstellendatei:

typedef unsigned uint32_t; 

Entfernen dass typedef Linie die Funktion wird nicht dazu führen zu werden aufrufbar aus dem Ziel Python-Bindung:

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

Die bisherigen typedef bin OK auf meine lokale Maschine, könnte aber auf einem anderen Compiler/Plattform anders sein. die Direktive %include "stdint.h" einen Fehler auf SWIG erhöhen:

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

Wich macht Sinn, da SWIG kein voll funktions Compiler ist, und kann den #ifdef auf diesen Header nicht vollständig auszuwerten.

Wie kann ich SWIG korrekt mit den Datentypen typisieren, die der Compiler für den Header stdint.h auswählt? Macht es tatsächlich Sinn, die korrekten Datentypen strikt durchzusetzen, oder einfach typedef alle intX_t bis long OK ist?

Antwort

11

Wenn Sie diese Typen in Ihrem SWIG Interface-Datei verwenden möchten Sie etwas tun können:

Sie können diese Frage auch lesen

%module test 
%include "stdint.i" 

uint32_t my_function(); 

der eine bestehende SWIG ist Schnittstelle hat die richtige typedef s für Ihr System.

0

Sie sollten typedef erzwingen, da uint32_t nicht plattformübergreifend ist und keinen Cross-Compiler. uint32_t ist C99-Standard, aber viele Compiler haben sich entschieden, diesen Standard nicht vollständig zu implementieren. Sie können eine haben, gehören in einen Cross-Compiler Art und Weise Arten Ihr Projekt neu zu definieren:

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

Es lohnt sich, die Einführung des Headers zu lesen ich oben verlinkt. Sie könnten dieses Include anstelle von stdint.h verwenden.

Cross-platform primitive data types in C++

Verwandte Themen