为什么这个.NET StructLayout for C ++示例

时间:2009-03-23 16:43:22

标签: c# .net c++

来自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 个答案:

答案 0 :(得分:1)

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

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

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