Как заставить SWIG использовать 64-битное целое число для intptr_t в Windows

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

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

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

1 ответ

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

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

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

Другие вопросы по тегам