Iphone Objective-C和C+中结构的大小+;

Iphone Objective-C和C+中结构的大小+;,iphone,c++,objective-c,struct,Iphone,C++,Objective C,Struct,我正在将一些Objective-C++代码转换为普通的Objective-C,并且在结构方面遇到了一些问题。对于这两种语言,我在.h文件中声明了如下结构 struct BasicNIDSHeader { short messageCode; short messageDate; int messageTime; int messageLength; short sourceID; short destID; short numberOfBl

我正在将一些Objective-C++代码转换为普通的Objective-C,并且在结构方面遇到了一些问题。对于这两种语言,我在.h文件中声明了如下结构

struct BasicNIDSHeader {
    short messageCode;
    short messageDate;
    int messageTime;
    int messageLength;
    short sourceID;
    short destID;
    short numberOfBlocks;
};
在C++中,结构被声明为

BasicNIDSHeader header;
在Objective-C中,我是这样做的

struct BasicNIDSHeader header;
在两种语言中使用它们的代码实际上是相同的

memset(&header, 0, sizeof(header));
[[fileHandle readDataOfLength:sizeof(header)] getBytes:&header];
其中fileHandle是NSFileHandle

问题是比原来的C++代码,Sigeof(头)=18。使用Objective-C时,sizeof(header)=20

你知道为什么会发生这种情况,或者如何解决它吗?代码依赖于C++中的大小。我可以把它硬编码,但我想更好地理解它发生的原因。而且我讨厌硬编码常量


谢谢

如果依赖于
struct
s的内部内存结构,则应禁用填充。这被称为“打包”,不同的编译器有不同的方式发送信号


在GCC中,您可以使用
\uuuuu属性\uuuuu
关键字执行此操作。详细说明。

我只能讲C++。在C++中,有一个实现特定的特征,它将数据对准特定地址,从而可以高效地处理数据。 可以用Prima:Ex/P>强制字节对齐
#pragma pack(1)

您可以使用Type,然后不需要修改所有的声明。您可以看到打印“<代码> >页眉,<代码> >页眉.MasaGeCudio<代码>,<代码>和页眉.MasaGeDATE< /COD>等,在两种语言中,看看是否有间隙,或者在最后有填充。或者只是Objective-C++(除了Objective-C之外)?你所显示的代码,在两种语言中都是相同的,当然不是C++。把.x属性文件((打包))添加到.h文件中。也在LLVM中工作。谢谢请注意,只需使用Objective-C++(回答您的另一个问题)。这是怎么回事?@Ross-它可能会在某些系统上引起对齐问题。@RossKimes:请按照链接了解详细信息。