2012-01-03 14 views
3

Objective-C++コードをObjective-Cに変換していますが、構造体に問題があります。どちらの言語でも、このような.hファイルで構造体が宣言されています。 C++で Objective-CとC++の構造体のサイズ

struct BasicNIDSHeader { 
    short messageCode; 
    short messageDate; 
    int messageTime; 
    int messageLength; 
    short sourceID; 
    short destID; 
    short numberOfBlocks; 
}; 

は、構造体は、私はそれらを使用するため、この

struct BasicNIDSHeader header; 

コードを実行します

BasicNIDSHeader header; 

ようにとObjective-Cで宣言されているが、実際に両方の言語で同じです。

memset(&header, 0, sizeof(header)); 
[[fileHandle readDataOfLength:sizeof(header)] getBytes:&header]; 

ここで、fileHandleはNSFileHandleです。 、はsizeof(ヘッダ)= 20

これが起こっまたはどのように修正することである理由を任意のアイデアを目的-Cを使用する場合

問題は、元のC++コードはsizeof(ヘッダ)= 18よりもですか?コードは、C++のようなサイズに依存しています。私はただそれをハードコードすることができますが、なぜそれが起こっているのかをよりよく理解したいと思います。プラス私はハードコーディング定数が嫌いです。

ありがとうございます!

+3

これは、パディングと呼ばれています。 –

+0

typedefを使用すると、すべての宣言を変更する必要はありません。 – sidyll

+1

'&header'、'&header.messageCode'、 '&header.messageDate'などを両方の言語で表示し、ギャップがあるかどうか、最後にパディングがあるかどうかを確認することで、変更箇所を確認できます。 – dasblinkenlight

答えて

2

structの内部メモリ構造に依存する場合は、パディングを無効にする必要があります。これは「パックされた」と呼ばれ、コンパイラごとに異なるシグナリング方法があります。

GCCでは、これは__attribute__キーワードで行います。詳細here

+0

.hファイルに__attribute __((packed))を追加しました。 LLVMでも使えます。ありがとう! –

+0

['__attribute __((packed))'は必ずしも安全であるとは限りません。](http://stackoverflow.com/questions/8568432/is-gccs-attribute-packed-pragma-pack-unsafe)。 –

+0

Objective-C++(あなたの他の質問に対する回答)。そしてどうですか? –

0

私はC++だけ話すことができます。 C++には、データを効率的に処理できるように、特定のアドレスにデータを整列させる実装固有の機能があります。

あなたはプラグマでバイトアライメントを強制することができますMS Visual C++で:

#pragma pack(1)