노조로 해결할 수 있습니다. NSValue
으로 지원되는 유형의 다른 멤버가 있고 구조보다 큰 크기의 유니온에 구조체를 넣기 만하면됩니다. 귀하의 경우에 이것은 long
에 대해 분명합니다.
union _bitfield_word_union
{
yourstructuretype bitfield;
long plain;
};
컴파일 타임에 크기가 계산되는 배열을 사용하여 구조의 크기를 조정하는 것에 대해 더 강력하게 만들 수 있습니다. (sizeof()
도 컴파일 시간 연산자는 것을 기억하시기 바랍니다.)
char plain[(sizeof(yourstructuretype)/sizeof(char)];
그런 다음 당신이 노동 조합에 비트 필드와 구조를 저장하고 plain
회원을 읽을 수 있습니다.
union converter = { .bitfield = yourstructuretypevalue };
long plain = converter.plain;
NSValue
인스턴스 생성시이 값을 사용하십시오. 독서는 반대 방향으로해야합니다.
나는 다른 멤버 값 (plain
)을 통해 멤버의 값 (bitfield
)을 읽고 그것을 다시 저장한다는 것을 기대할 수 있기 때문에 C99의 기술적 교정을 통해 표준 준수 (타입 펀칭이라고도 함)되었다고 확신한다. 읽히는 구성원이 최소한 작성된 구성원만큼 큰 경우 정의됩니다. (plain
에는 정의되지 않은 비트 9-31/63이있을 수 있지만 그것에 대해 신경 쓸 필요는 없습니다.) 그러나 실제와 일치합니다.
더티 해킹? 아마도. C99라고 부를 수도 있습니다. 그러나 비트 필드를 NSValue
과 함께 사용하면 더러운 해킹을 사용하는 것처럼 들립니다.
비트 필드 지정자를 제거하면 작동합니까? –
재미있는 질문이지만, 비트 필드를 전혀 사용하지 말 것을 권합니다. –
어쨌든 NSValue에 넣는 오버 헤드를 추가 할 때 비트 필드를 사용하면 어떨까요? –