2012-01-03 87 views
3

我正在将一些Objective-C++代码转换为普通的Objective-C,并且我遇到了一些结构问题。对于这两种语言,我都有像这样在.h文件中声明的结构体。Objective-C和C++结构体的大小

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++代码,的sizeof(标题)= 18。当使用Objective-C,的sizeof(标题)= 20。

任何想法为什么发生这种情况或如何解决?代码依赖于C++中的大小。我可以对它进行硬编码,但希望更好地了解它为什么会发生。另外我讨厌硬编码常量。

谢谢!

+3

这就是所谓的填充。 – 2012-01-03 22:05:21

+0

你可以使用typedef,然后你不需要修改所有的声明。 – sidyll 2012-01-03 22:06:53

+1

你可以通过在这两种语言中打印'&header','&header.messageCode','&header.messageDate'等来查看是否有改变的地方,并查看是否有间隙,或者末尾是否有填充。 – dasblinkenlight 2012-01-03 22:08:52

回答

2

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

在海湾合作委员会你可以用__attribute__这个关键词来做到这一点。详情here

+0

将__attribute __((packed))添加到.h文件中。也适用于LLVM。谢谢! – 2012-01-03 22:18:56

+0

请注意['__attribute __((packed))'不一定是安全的](http://stackoverflow.com/questions/8568432/is-gccs-attribute-packed-pragma-pack-unsafe)。 – 2012-01-03 22:27:58

+0

Just Objective-C++(回应你的其他问题)。怎么这样? – 2012-01-03 22:37:14

0

我只能说C++。在C++中有一个特定于实现的特性,它将特定地址上的数据对齐,以便可以高效地处理数据。

在微软的Visual C++可以强制使用编译字节对齐:

#pragma pack(1)