为啥这个用于 C++ 的 .NET StructLayout 示例

Posted

技术标签:

【中文标题】为啥这个用于 C++ 的 .NET StructLayout 示例【英文标题】:Why this sample of .NET StructLayout for C++为什么这个用于 C++ 的 .NET StructLayout 示例 【发布时间】:2009-03-23 16:43:21 【问题描述】:

来自http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.structlayoutattribute(VS.71).aspx:

[C++] 

[StructLayout(LayoutKind::Explicit, Size=16, CharSet=CharSet::Ansi)]
__value class MySystemTime 
public:
   [FieldOffset(0)] short int wYear;
   [FieldOffset(2)] short int  wMonth;
   [FieldOffset(4)] short int  wDayOfWeek;
   [FieldOffset(6)] short int  wDay;
   [FieldOffset(8)] short int  wHour;
   [FieldOffset(10)] short int  wMinute;
   [FieldOffset(12)] short int  wSecond;
   [FieldOffset(14)] short int  wMilliseconds;
;

这是我的想象,还是方括号中的元素与 C++ 语法不一致?

当 C++ 提供了足够的工具来在语言的标准定义中指定结构布局时(也许还有通常支持的 #pragma pack() ),为什么还要麻烦做所有这些。语言中设计的兼容性不能保证您可以在 C++ 中定义任何可以在 C 中定义的结构吗?我理解需要能够用其他语言显式描述 C 结构的布局,但似乎没有必要使用 C++ 提供

extern "C"  

【问题讨论】:

【参考方案1】:

方括号中的东西称为属性,经常出现在C#代码中。它们在这里似乎具有相同的含义,因为这不是严格的 C++。它具有 Microsoft 扩展以允许与 CLI 集成。

当您在 C 或 C++ 中声明这样的结构时,这并不能保证特定的内存布局。要控制它,您需要特殊的编译指示来控制“打包”。这些是特定于平台的。所以你在这里看到的只是 CLR 的等价物。

更新:该示例来自旧版本的 Microsoft CLI 集成 C++ 文档,称为托管 C++。它很快就被放弃了,并在下一个版本中被C++/CLI 取代——将 CLI 功能移植到 C++ 中,它是如此完整和广泛,它实际上变成了一种不同的语言,就像 C++ 是一种不同于 C 的语言一样。

【讨论】:

以上是关于为啥这个用于 C++ 的 .NET StructLayout 示例的主要内容,如果未能解决你的问题,请参考以下文章

为啥 .Net 代码版本挂起,但 C++ 没有?

为啥这个算法在 python 中的运行速度比在 C++ 中快得多?

为啥用 C 复制文件比 C++ 快得多?

为啥相同的语句不适用于 C++ 中的类成员?

为啥在 VB.NET 中使用 DeviceIoControl 进行文件枚举比在 C++ 中更快?

为啥 .NET API 浏览器示例是用 C++ 而不是 C# 编写的? [关闭]