C++ / C# PInvoke - 封送显式大小的数字

C++ / C# PInvoke - Marshalling explicitly sized numerics

本文关键字:数字 PInvoke C++      更新时间:2023-10-16
如果我希望将 C# (Int32) 中的int

封送到本机 (C++) 库/从本机 () 库封送,在C++代码中声明相关变量的最佳方法是什么?

我可以使用标准int但我宁愿明确该变量的宽度(我知道它在大多数平台上都是 32 位的)。

到目前为止,我可以看到两个选项:

  • int32_t
  • __int32(MSVC++ 标识符) ...但是,如果可以的话,我想保持平台独立

我似乎记得听说 C++11 为此有一些新库,但我似乎找不到任何提及它的地方。

谢谢。

当前发布的 C# 和 C++ 编译器中的int关键字分别是 System.Int32 和 __int32 的类型别名,这些类型是其后端使用的具体类型。 我已经写了 30 年的代码,使用过 8 位、16 位、32 位和 64 位处理器。 30年前和我今天一样使用并且花费很少的精力将程序移植到下一代架构或操作系统版本。

你也可以在winapi中看到这一点。 用于函数参数或返回值的每个类型都是一个类型别名。 Windows 1.0 版中的 CreateWindow() 函数看起来与您在 64位版本的 Windows 8.1 中使用的函数完全相同

。我不幻想这种进展今天突然停止了。 128位处理器已经是IBM的必备品。 语言使用类型别名来防止自己迅速过时和被遗忘。 对于 C 和 C++ 等语言如此,对于 C# 也是如此。 尽管在 C# 的情况下肯定需要移动更大的石头,但这个身份现在刻在大多数 C# 程序员的脑海中。

有意不使用类型别名会使程序的可移植性降低

您可以使用正好是 32 位的int32_t。可能存在未定义int32_t的C++实现,但在这种情况下,所有赌注都已关闭。

在我所知道的每个支持 C# 的平台上,C/C++ int 是 32 位,所以你可能想多了。

要考虑的另一件事是您的C++代码接受的类型。如果它接受 int,并且您使用的平台 int 不是 32 位,那么您仍然有问题。