c ++ - Sådan gør du SWIG bruger 64bit heltal til intptr\_t på Windows

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg vil gerne bruge SWIG på Windows til at opbygge 64 bit applikationer. Jeg har en klasse, der har en peger i den til en buffer, og fordi jeg gerne vil interface med en .NET klasse, er pointeren erklæret som intptr\_t.


Problemet er, at standard SWIG stdint.i forudsætter at intptr\_t er enten int (på 32 bit miljø) eller long (på 64 bit miljø). Selv om dette er sandt på Unix, er det falskt på Windows. Har nogen nogenlunde lignende erfaringer eller ideer, hvordan man kan skabe en løsning på dette?


Jeg har allerede oprettet de typeplaner, der er nødvendige til konverteringen af ​​intptr\_t => IntPtr, og den fungerer fint i 32 bit-miljø, men det afkortes markøren i 64 bit-miljø.

Bedste reference


Ok, jeg vil svare på mit eget spørgsmål. Det ser ud som om det er en fejl i SWIG på Windows, at den behandler long som int64 på 64-bit Windows, mens det i realiteten er en int32. Se mere om dette emne her:
Hvad er bitstørrelsen på lang tid på 64-bit Windows?


Det andet problem med SWIG er, at det adskiller 32 og 64 bit kode, men grunden til at jeg brugte intptr\_t var at undgå bitness problemer, som ved definition giver det et helt tal, der er stort nok til at holde en pointer.


Så hvad jeg gjorde i slutningen var at skrive et script, som jeg kører efter at have genereret omslaget til at rette typesignaturerne fra int til intptr\_t. Selv om dette ikke er elegant, skal jeg allerede gøre det af andre grunde til min Python og PHP wrappers.