2014-01-12 4 views
0

, если я хочу маршалировать int в C# (Int32) в/из родной (C++) библиотеки, что является лучшим способом объявить соответствующую переменную в C++-коде?C++/C# PInvoke - Marshalling явно размерные числа

Я мог бы использовать стандарт int, но я предпочел бы быть явным о ширине этой переменной (я знаю, что это 32-разрядная версия на большинстве платформ).

До сих пор я вижу два варианта:

  • int32_t в <cstdint> (идентификатор MSVC++)
  • ... Тем не менее, я хотел бы остаться независимым от платформы, если я могу

Мне кажется, что я слышал, что у C++ 11 есть новая библиотека для этого, но я не могу найти никаких упоминаний об этом.

спасибо.

+0

int32_t кажется достойным вариантом –

ответ

1

INT ключевое слово в настоящее время судоходство C# и C++ компиляторов являются псевдонимами типа, соответственно для System.Int32 и __int32, конкретных типов, используемых их обратными концами. Я писал код в течение 30 лет и использовал 8-битные, 16-битные, 32-битные и 64-разрядные процессоры. И использовано int 30 лет назад как я делаю сегодня. И потратил очень мало усилий на перенос программ на архитектуру следующего поколения или версию операционной системы.

Вы видите это снова в winapi. Каждый тип, используемый для аргумента функции или возвращаемого значения, является псевдонимом типа. Функция CreateWindow() в Windows версии 1.0 выглядит точно такая же, как и в 64-разрядной версии Windows 8.1

У меня нет иллюзий, что эта прогрессия внезапно прекратилась сегодня. 128-битные процессоры уже являются хлебом-маслом для IBM. Языки используют псевдонимы типов, чтобы не допустить, чтобы они быстро устарели и забыли. Верно для таких языков, как C и C++, для C#. Несмотря на то, что в случае C#, конечно же, потребуется переместить более крупный камень, то личность выгравирована в большинстве задач программиста C# прямо сейчас.

Преднамеренно не Использование псевдонимов типов делает вашу программу less переносной.

+0

В C++ int не является псевдонимом типа для __int32 –

+0

Это, безусловно, в компиляторе Microsoft. Когда-нибудь это будет что-то еще, возможно, __int64. –

+0

Несомненно. Но ты этого не сказал. Вы сказали «на языке C++». –

0

Вы можете использовать int32_t, который составляет ровно 32 бита. Возможно, существует реализация C++, для которой int32_t не определен, но в этом случае все ставки отключены.

На каждой платформе, о которой я знаю, которая поддерживает C#, тогда C/C++ int составляет 32 бита, и поэтому вы можете передумать это.

Еще одна вещь, которую следует учитывать, - это то, что принимает ваш код на C++. Если он принимает int, и вы используете платформу, где int не 32 бита, то у вас все еще есть проблема.

Смежные вопросы