Как заставить SWIG использовать 64-битное целое число для intptr_t в Windows - PullRequest
1 голос
/ 19 марта 2012

Я хотел бы использовать SWIG в Windows для создания 64-битных приложений.У меня есть класс, в котором есть указатель на буфер, и, поскольку я хотел бы взаимодействовать с классом .NET, указатель объявлен как intptr_t.

Проблема заключается в том, что стандарт SWIG stdint.i предполагает, что intptr_t это либо int (в 32-битной среде), либо long (в 64-битной среде).Хотя это верно для Unix, это неверно для Windows.У кого-нибудь есть подобный опыт или какие-либо идеи, как создать обходной путь для этого?

Я уже настроил карты типов, необходимые для преобразования intptr_t => IntPtr, и он отлично работает в 32-битной среде., но он усекает указатель в 64-битной среде.

1 Ответ

0 голосов
/ 20 марта 2012

Хорошо, я отвечу на свой вопрос. Похоже, что это ошибка в SWIG в Windows, которая обрабатывает long как int64 в 64-битной Windows, в то время как на самом деле это int32. Подробнее об этой теме смотрите здесь: Каков размер long в 64-битной Windows?

Другая проблема с SWIG заключается в том, что он различает 32- и 64-битный код, но причина, по которой я использовал intptr_t, состояла в том, чтобы избежать проблем с битностью, поскольку по определению он дает целое число, достаточно большое для хранения указателя.

Итак, в конце я написал сценарий, который я запускаю после генерации оболочки для исправления сигнатур типов от int до intptr_t. Хотя это не элегантно, я уже должен сделать это по другим причинам для своих оболочек Python и PHP.

...