c # эквивалент для c ++ / cli long - PullRequest
2 голосов
/ 03 августа 2011

Я объявил метод в C # следующим образом:

[OperationContract]
[FaultContract(typeof(MyException))]
MyClass MyMethod(... some params ..., Int32[] myParam);

И в C ++ / CLI необходимо написать метод, соответствующий интерфейсу:

MyClass^ MyMethod(... some params ..., array<long>^ myParam) { ...

Мне нужно передатьмассив длинных для мира C ++ из .Net.Я знаю, что C ++ long - это не .Net long.Но я не знаю, как это сделать.

Ответы [ 3 ]

3 голосов
/ 03 августа 2011

Что не так с System::Int32 (или просто Int32, поскольку большинство исходных файлов C ++ / CLI имеют using namespace System)?

MyClass^ MyMethod(... some params ..., array<Int32>^ myParam) 

Как правило, используйте типы .NET при разговоре с.NET.

0 голосов
/ 22 декабря 2012

long и int в C ++ имеют одинаковый размер (4 байта) и оба сопоставлены с типом .NET System.Int32. Однако long при использовании в качестве параметра или в поле имеет необязательный модификатор System.Runtime.CompilerServices.IsLong (в CIL это int32 modopt([mscorlib]System.Runtime.CompilerServices.IsLong))

Это позволяет создавать перегрузки метода, отличающиеся только параметром int / long.

0 голосов
/ 03 августа 2011

В компиляторе C ++ для MSVC long и int имеют одинаковый размер. Я не уверен, если вы думаете о long long, который представляет собой 64-разрядное целое число со знаком в MSVC. Если вы имеете в виду просто long, тогда Int32 в .Net должно быть в порядке.

Чтобы быть в безопасности, вы можете использовать предоставленные макросы для 32-битных целых чисел со знаком:

#include <cstdint>

MyClass^ MyMethod(... params ..., array<int32_t>^ myParam) { ...

Или еще лучше, используя определенные типы .NET, как рекомендует Александр C:

MyClass^ MyMethod(... params ..., array<System::Int32>^ myParam) { ...

Самое важное, на что следует обратить внимание, это то, что int, long, int32_t и System::Int32 имеют одинаковый точный размер в текущем компиляторе MSVC C ++. Неважно, какой вы используете, но int32_t и System::Int32 - самый безопасный выбор.

Microsoft может изменить их long на более поздний срок, чтобы иметь размер больше 32-битного. Если это произойдет, то вы можете перекомпилировать этот же код с новым компилятором без проблем.

Что касается размера каждого типа данных, стандарт требует, чтобы int и long имели размер не менее 4 байтов. На некоторых компиляторах вы можете обнаружить, что sizeof(long) != sizeof(int). По этой причине, если вы хотите убедиться, что вы используете целые числа, равные 4 байтам, вы должны использовать предоставленные заголовки, которые гарантируют требуемый размер.

Подробнее см. Здесь: http://en.wikipedia.org/wiki/Long_integer. Статья содержит соответствующие ссылки на стандарты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...