2012-01-03 92 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)