【问题标题】: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" { }

【问题讨论】:

    标签: c# .net c++


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-23
      • 2011-04-10
      • 1970-01-01
      • 2020-12-26
      • 1970-01-01
      相关资源
      最近更新 更多