2012-01-03 5 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; 

추천하고 목표 - 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의 내부 메모리 구조에 의존하는 경우에는 패딩을 비활성화해야합니다. 이것은 "packed"라고 불리우며, 다른 컴파일러는이를 다른 방법으로 알립니다.

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 비주얼 C에서

:

#pragma pack(1)