2011-08-03 22 views
2

我聲明在C#像這樣的方法:C#當量爲C++/CLI長

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

而在C++/CLI需要寫接口相匹配的方法:

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

我需要從.Net中爲C++世界傳遞一系列long值。我知道C++ long並不是.Net long。但我不知道如何做到這一點。

+0

我認爲C++中的一個長是一個有符號的4字節整數?這與.Net Int32相同。 –

+0

@chibacity:是的。這也是依賴於實現的東西。 –

+0

@飛利浦,你錯過了一個絕好的機會不要發佈! – Blindy

回答

0

在用於MSVC的C++編譯器中,longint具有相同的大小。我不確定你是否想到long long,它表示MSVC中的一個64位有符號整數。如果你的意思只是long雖然,那麼在.Net內Int32應該沒問題。

要想獲得真正的安全,你可以使用提供的宏符號的32位整數:

#include <cstdint> 

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

或者更好的是,使用.NET定義類型爲亞歷山大Ç建議:

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

需要注意的最重要的事情是,在當前的MSVC C++編譯器中,int,long,int32_tSystem::Int32的大小完全相同。使用哪個並不重要,但int32_tSystem::Int32是最安全的選擇。

微軟可以在以後更改他們的long爲32位大小。如果發生這種情況,那麼您可以用新的編譯器重新編譯這個相同的代碼,而不會產生任何問題。

關於每個數據類型的大小,該標準要求intlong至少4個字節大。在某些編譯器上,您可能會發現sizeof(long) != sizeof(int)。出於這個原因,如果你想確保你使用的是整數4個字節大的整數,你應該使用提供的頭部來保證所需的大小。

欲瞭解更多詳情請參閱這裏:http://en.wikipedia.org/wiki/Long_integer。文章包含了相關的標準鏈接。

+0

在C++中我需要很長時間(不長)。在C#中我可以聲明任何東西。 –

+0

然後使用'int','long'或'System :: Int32'。三者完全相同。我認爲'System :: Int32'最能描述你的意圖。 –

3

System::Int32(或簡單的Int32,因爲大多數C++/CLI源文件有using namespace System)有什麼問題?

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

通常,在與.NET通話時使用.NET類型。

+0

好點。我忘了在C++/CLI中有'System :: Int32' –

+0

我需要將一個長變量添加到C++結構的長整型集合中。 –

+0

@ vasek7:'long'與MSVC的C++編譯器中的'System :: Int32'相同。 –

0

long和C++有相同的尺寸(4個字節),並且兩者都映射到.NET類型System.Int32 int。然而,long,作爲參數或在田間使用時,具有任選的改性劑System.Runtime.CompilerServices.IsLong(在CIL,它是int32 modopt([mscorlib]System.Runtime.CompilerServices.IsLong)

這允許創建方法重載僅在int/long參數不同。